48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/ADT/DenseSet.h"
50#include "llvm/ADT/SmallBitVector.h"
51#include "llvm/ADT/SmallPtrSet.h"
52#include "llvm/ADT/SmallString.h"
53#include "llvm/ADT/StringSwitch.h"
54#include "llvm/ADT/Twine.h"
55#include "llvm/ADT/iterator_range.h"
56#include "llvm/Support/Casting.h"
57#include "llvm/Support/Path.h"
58#include "llvm/Support/raw_ostream.h"
77 typedef bool (ResultBuilder::*LookupFilter)(
const NamedDecl *)
const;
79 typedef CodeCompletionResult Result;
83 std::vector<Result> Results;
88 llvm::SmallPtrSet<const Decl *, 16> AllDeclsFound;
90 typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
95 class ShadowMapEntry {
96 typedef SmallVector<DeclIndexPair, 4> DeclIndexPairVector;
100 llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
104 unsigned SingleDeclIndex = 0;
107 ShadowMapEntry() =
default;
108 ShadowMapEntry(
const ShadowMapEntry &) =
delete;
109 ShadowMapEntry(ShadowMapEntry &&Move) { *
this = std::move(Move); }
110 ShadowMapEntry &operator=(
const ShadowMapEntry &) =
delete;
111 ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
112 SingleDeclIndex =
Move.SingleDeclIndex;
113 DeclOrVector =
Move.DeclOrVector;
114 Move.DeclOrVector =
nullptr;
118 void Add(
const NamedDecl *ND,
unsigned Index) {
119 if (DeclOrVector.isNull()) {
122 SingleDeclIndex = Index;
126 if (
const NamedDecl *PrevND = dyn_cast<const NamedDecl *>(DeclOrVector)) {
129 DeclIndexPairVector *Vec =
new DeclIndexPairVector;
130 Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
136 ->push_back(DeclIndexPair(ND, Index));
140 if (DeclIndexPairVector *Vec =
141 dyn_cast_if_present<DeclIndexPairVector *>(DeclOrVector)) {
143 DeclOrVector = ((NamedDecl *)
nullptr);
156 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
163 CodeCompletionAllocator &Allocator;
165 CodeCompletionTUInfo &CCTUInfo;
173 bool AllowNestedNameSpecifiers;
184 std::list<ShadowMap> ShadowMaps;
188 llvm::DenseMap<std::pair<DeclContext *,
uintptr_t>, ShadowMapEntry>
193 Qualifiers ObjectTypeQualifiers;
198 bool HasObjectTypeQualifiers;
201 bool IsExplicitObjectMemberFunction;
204 Selector PreferredSelector;
207 CodeCompletionContext CompletionContext;
211 ObjCImplementationDecl *ObjCImplementation;
213 void AdjustResultPriorityForDecl(Result &R);
215 void MaybeAddConstructorResults(Result R);
218 explicit ResultBuilder(Sema &SemaRef, CodeCompletionAllocator &Allocator,
219 CodeCompletionTUInfo &CCTUInfo,
220 const CodeCompletionContext &CompletionContext,
221 LookupFilter Filter =
nullptr)
222 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
223 Filter(Filter), AllowNestedNameSpecifiers(
false),
224 HasObjectTypeQualifiers(
false), IsExplicitObjectMemberFunction(
false),
225 CompletionContext(CompletionContext), ObjCImplementation(
nullptr) {
228 switch (CompletionContext.getKind()) {
229 case CodeCompletionContext::CCC_Expression:
230 case CodeCompletionContext::CCC_ObjCMessageReceiver:
231 case CodeCompletionContext::CCC_ParenthesizedExpression:
232 case CodeCompletionContext::CCC_Statement:
233 case CodeCompletionContext::CCC_TopLevelOrExpression:
234 case CodeCompletionContext::CCC_Recovery:
235 if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl())
236 if (Method->isInstanceMethod())
237 if (ObjCInterfaceDecl *Interface = Method->getClassInterface())
238 ObjCImplementation = Interface->getImplementation();
247 unsigned getBasePriority(
const NamedDecl *D);
251 bool includeCodePatterns()
const {
252 return SemaRef.CodeCompletion().CodeCompleter &&
253 SemaRef.CodeCompletion().CodeCompleter->includeCodePatterns();
257 void setFilter(LookupFilter Filter) { this->Filter = Filter; }
259 Result *data() {
return Results.empty() ?
nullptr : &Results.front(); }
260 unsigned size()
const {
return Results.size(); }
261 bool empty()
const {
return Results.empty(); }
264 void setPreferredType(QualType T) {
265 PreferredType = SemaRef.Context.getCanonicalType(T);
275 void setObjectTypeQualifiers(Qualifiers Quals,
ExprValueKind Kind) {
276 ObjectTypeQualifiers = Quals;
278 HasObjectTypeQualifiers =
true;
281 void setExplicitObjectMemberFn(
bool IsExplicitObjectFn) {
282 IsExplicitObjectMemberFunction = IsExplicitObjectFn;
290 void setPreferredSelector(Selector Sel) { PreferredSelector = Sel; }
294 const CodeCompletionContext &getCompletionContext()
const {
295 return CompletionContext;
299 void allowNestedNameSpecifiers(
bool Allow =
true) {
300 AllowNestedNameSpecifiers =
Allow;
305 Sema &getSema()
const {
return SemaRef; }
308 CodeCompletionAllocator &getAllocator()
const {
return Allocator; }
310 CodeCompletionTUInfo &getCodeCompletionTUInfo()
const {
return CCTUInfo; }
319 bool isInterestingDecl(
const NamedDecl *ND,
320 bool &AsNestedNameSpecifier)
const;
328 bool canFunctionBeCalled(
const NamedDecl *ND, QualType BaseExprType)
const;
336 bool canCxxMethodBeCalled(
const CXXMethodDecl *
Method,
337 QualType BaseExprType)
const;
345 bool CheckHiddenResult(Result &R, DeclContext *CurContext,
346 const NamedDecl *Hiding);
355 void MaybeAddResult(Result R, DeclContext *CurContext =
nullptr);
371 void AddResult(Result R, DeclContext *CurContext, NamedDecl *Hiding,
372 bool InBaseClass, QualType BaseExprType,
373 bool IsInDeclarationContext,
bool IsAddressOfOperand);
376 void AddResult(Result R);
379 void EnterNewScope();
388 void addVisitedContext(DeclContext *Ctx) {
389 CompletionContext.addVisitedContext(Ctx);
398 bool IsOrdinaryName(
const NamedDecl *ND)
const;
399 bool IsOrdinaryNonTypeName(
const NamedDecl *ND)
const;
400 bool IsIntegralConstantValue(
const NamedDecl *ND)
const;
401 bool IsOrdinaryNonValueName(
const NamedDecl *ND)
const;
402 bool IsNestedNameSpecifier(
const NamedDecl *ND)
const;
403 bool IsEnum(
const NamedDecl *ND)
const;
404 bool IsClassOrStruct(
const NamedDecl *ND)
const;
405 bool IsUnion(
const NamedDecl *ND)
const;
406 bool IsNamespace(
const NamedDecl *ND)
const;
407 bool IsNamespaceOrAlias(
const NamedDecl *ND)
const;
408 bool IsType(
const NamedDecl *ND)
const;
409 bool IsMember(
const NamedDecl *ND)
const;
410 bool IsOffsetofField(
const NamedDecl *ND)
const;
411 bool IsObjCIvar(
const NamedDecl *ND)
const;
412 bool IsObjCMessageReceiver(
const NamedDecl *ND)
const;
413 bool IsObjCMessageReceiverOrLambdaCapture(
const NamedDecl *ND)
const;
414 bool IsObjCCollection(
const NamedDecl *ND)
const;
415 bool IsImpossibleToSatisfy(
const NamedDecl *ND)
const;
428 for (
auto *Redecl : Function->getFirstDecl()->redecls()) {
432 if (Redecl->getNumParams() < ParaCount)
434 for (
unsigned P = Start, N = Redecl->getNumParams(); P != N; ++P)
435 if (Redecl->getParamDecl(P)->getIdentifier())
447 ComputeType =
nullptr;
448 Type = BSI->ReturnType;
452 ComputeType =
nullptr;
456 ComputeType =
nullptr;
457 Type =
Method->getReturnType();
465 auto *VD = llvm::dyn_cast_or_null<ValueDecl>(D);
466 ComputeType =
nullptr;
467 Type = VD ? VD->getType() :
QualType();
483 ComputeType =
nullptr;
493 this->ComputeType = ComputeType;
503 if (ExpectedLoc == LParLoc)
514 if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
517 if (Op == tok::minus)
530 case tok::minusequal:
532 case tok::percentequal:
534 case tok::slashequal:
540 case tok::equalequal:
541 case tok::exclaimequal:
545 case tok::greaterequal:
549 case tok::greatergreater:
550 case tok::greatergreaterequal:
552 case tok::lesslessequal:
565 case tok::caretequal:
573 case tok::periodstar:
591 if (!ContextType.isNull() && ContextType->isPointerType())
592 return ContextType->getPointeeType();
595 if (ContextType.isNull())
601 case tok::minusminus:
603 if (ContextType.isNull())
611 assert(
false &&
"unhandled unary op");
620 ComputeType =
nullptr;
627 if (!Enabled || !
Base)
630 if (ExpectedLoc !=
Base->getBeginLoc())
641 ComputeType =
nullptr;
650 ComputeType =
nullptr;
659 ComputeType =
nullptr;
667 ComputeType =
nullptr;
673 llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
674 unsigned SingleDeclIndex;
686 pointer(
const DeclIndexPair &Value) : Value(Value) {}
694 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
697 : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
719 if (
const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrIterator))
728 return X.DeclOrIterator.getOpaqueValue() ==
729 Y.DeclOrIterator.getOpaqueValue() &&
730 X.SingleDeclIndex == Y.SingleDeclIndex;
739ResultBuilder::ShadowMapEntry::begin()
const {
740 if (DeclOrVector.isNull())
743 if (
const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrVector))
744 return iterator(ND, SingleDeclIndex);
750ResultBuilder::ShadowMapEntry::end()
const {
775 for (
const DeclContext *CommonAncestor = TargetContext;
776 CommonAncestor && !CommonAncestor->
Encloses(CurContext);
777 CommonAncestor = CommonAncestor->getLookupParent()) {
778 if (CommonAncestor->isTransparentContext() ||
779 CommonAncestor->isFunctionOrMethod())
782 TargetParents.push_back(CommonAncestor);
786 while (!TargetParents.empty()) {
787 const DeclContext *Parent = TargetParents.pop_back_val();
789 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(Parent)) {
790 if (!Namespace->getIdentifier())
794 }
else if (
const auto *TD = dyn_cast<TagDecl>(Parent)) {
827bool ResultBuilder::isInterestingDecl(
const NamedDecl *ND,
828 bool &AsNestedNameSpecifier)
const {
829 AsNestedNameSpecifier =
false;
855 if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
857 Filter != &ResultBuilder::IsNamespaceOrAlias && Filter !=
nullptr))
858 AsNestedNameSpecifier =
true;
861 if (Filter && !(this->*Filter)(Named)) {
863 if (AllowNestedNameSpecifiers && SemaRef.
getLangOpts().CPlusPlus &&
864 IsNestedNameSpecifier(ND) &&
865 (Filter != &ResultBuilder::IsMember ||
868 AsNestedNameSpecifier =
true;
887 R.Declaration->getDeclContext()->getRedeclContext();
898 R.QualifierIsInformative =
false;
902 R.Declaration->getDeclContext());
909 switch (T->getTypeClass()) {
912 case BuiltinType::Void:
915 case BuiltinType::NullPtr:
918 case BuiltinType::Overload:
919 case BuiltinType::Dependent:
922 case BuiltinType::ObjCId:
923 case BuiltinType::ObjCClass:
924 case BuiltinType::ObjCSel:
937 case Type::BlockPointer:
940 case Type::LValueReference:
941 case Type::RValueReference:
944 case Type::ConstantArray:
945 case Type::IncompleteArray:
946 case Type::VariableArray:
947 case Type::DependentSizedArray:
950 case Type::DependentSizedExtVector:
952 case Type::ExtVector:
955 case Type::FunctionProto:
956 case Type::FunctionNoProto:
965 case Type::ObjCObject:
966 case Type::ObjCInterface:
967 case Type::ObjCObjectPointer:
981 if (
const auto *
Type = dyn_cast<TypeDecl>(ND))
983 if (
const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
984 return C.getObjCInterfaceType(Iface);
989 else if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(ND))
990 T =
Method->getSendResultType();
991 else if (
const auto *
Enumerator = dyn_cast<EnumConstantDecl>(ND))
995 else if (
const auto *
Property = dyn_cast<ObjCPropertyDecl>(ND))
997 else if (
const auto *
Value = dyn_cast<ValueDecl>(ND))
1008 T = Ref->getPointeeType();
1013 if (
Pointer->getPointeeType()->isFunctionType()) {
1014 T =
Pointer->getPointeeType();
1022 T =
Block->getPointeeType();
1037unsigned ResultBuilder::getBasePriority(
const NamedDecl *ND) {
1045 if (
const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
1046 if (ImplicitParam->getIdentifier() &&
1047 ImplicitParam->getIdentifier()->isStr(
"_cmd"))
1076 CompletionContext.
getKind() ==
1078 CompletionContext.
getKind() ==
1085void ResultBuilder::AdjustResultPriorityForDecl(
Result &R) {
1088 if (!PreferredSelector.
isNull())
1089 if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(
R.Declaration))
1090 if (PreferredSelector ==
Method->getSelector())
1095 if (!PreferredType.
isNull()) {
1105 !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
1115 Context.DeclarationNames.getCXXConstructorName(RecordTy);
1116 return Record->lookup(ConstructorName);
1119void ResultBuilder::MaybeAddConstructorResults(
Result R) {
1120 if (!SemaRef.
getLangOpts().CPlusPlus || !
R.Declaration ||
1127 Record = ClassTemplate->getTemplatedDecl();
1128 else if ((
Record = dyn_cast<CXXRecordDecl>(D))) {
1142 R.Declaration = Ctor;
1144 Results.push_back(R);
1149 if (
const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
1150 ND = Tmpl->getTemplatedDecl();
1155 assert(!ShadowMaps.empty() &&
"Must enter into a results scope");
1157 if (
R.Kind != Result::RK_Declaration) {
1159 Results.push_back(R);
1164 if (
const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(
R.Declaration)) {
1166 getBasePriority(
Using->getTargetDecl()),
1170 std::move(
R.FixIts));
1172 MaybeAddResult(
Result, CurContext);
1176 const Decl *CanonDecl =
R.Declaration->getCanonicalDecl();
1179 bool AsNestedNameSpecifier =
false;
1180 if (!isInterestingDecl(
R.Declaration, AsNestedNameSpecifier))
1187 ShadowMap &SMap = ShadowMaps.back();
1188 ShadowMapEntry::iterator I, IEnd;
1189 ShadowMap::iterator NamePos = SMap.find(
R.Declaration->getDeclName());
1190 if (NamePos != SMap.end()) {
1191 I = NamePos->second.begin();
1192 IEnd = NamePos->second.end();
1195 for (; I != IEnd; ++I) {
1197 unsigned Index = I->second;
1200 Results[Index].Declaration =
R.Declaration;
1210 std::list<ShadowMap>::iterator
SM, SMEnd = ShadowMaps.end();
1212 for (
SM = ShadowMaps.begin();
SM != SMEnd; ++
SM) {
1213 ShadowMapEntry::iterator I, IEnd;
1214 ShadowMap::iterator NamePos =
SM->find(
R.Declaration->getDeclName());
1215 if (NamePos !=
SM->end()) {
1216 I = NamePos->second.begin();
1217 IEnd = NamePos->second.end();
1219 for (; I != IEnd; ++I) {
1221 if (I->first->hasTagIdentifierNamespace() &&
1229 I->first->getIdentifierNamespace() != IDNS)
1233 if (CheckHiddenResult(R, CurContext, I->first))
1241 if (!AllDeclsFound.insert(CanonDecl).second)
1246 if (AsNestedNameSpecifier) {
1247 R.StartsNestedNameSpecifier =
true;
1250 AdjustResultPriorityForDecl(R);
1253 if (
R.QualifierIsInformative && !
R.Qualifier &&
1254 !
R.StartsNestedNameSpecifier) {
1255 const DeclContext *Ctx =
R.Declaration->getDeclContext();
1256 if (
const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1259 else if (
const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
1263 std::nullopt, Tag,
false)
1266 R.QualifierIsInformative =
false;
1271 SMap[
R.Declaration->getDeclName()].Add(
R.Declaration, Results.size());
1272 Results.push_back(R);
1274 if (!AsNestedNameSpecifier)
1275 MaybeAddConstructorResults(R);
1280 R.InBaseClass =
true;
1301 for (
unsigned I = 0, E = Candidate.
getNumParams(); I != E; ++I)
1302 if (Candidate.
parameters()[I]->getType().getCanonicalType() !=
1303 Incumbent.
parameters()[I]->getType().getCanonicalType())
1312 if (CandidateRef != IncumbentRef) {
1328 if (CandidateSuperset == IncumbentSuperset)
1340 const auto *CurrentClassScope = [&]() ->
const CXXRecordDecl * {
1342 const auto *CtxMethod = llvm::dyn_cast<CXXMethodDecl>(Ctx);
1343 if (CtxMethod && !CtxMethod->getParent()->isLambda()) {
1344 return CtxMethod->getParent();
1351 bool FunctionCanBeCall =
1352 CurrentClassScope &&
1353 (CurrentClassScope ==
Method->getParent() ||
1354 CurrentClassScope->isDerivedFrom(
Method->getParent()));
1357 if (FunctionCanBeCall)
1362 BaseExprType.
isNull() ?
nullptr
1364 auto *MaybeBase =
Method->getParent();
1366 MaybeDerived == MaybeBase || MaybeDerived->isDerivedFrom(MaybeBase);
1369 return FunctionCanBeCall;
1372bool ResultBuilder::canFunctionBeCalled(
const NamedDecl *ND,
1383 if (
const auto *FuncTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
1384 ND = FuncTmpl->getTemplatedDecl();
1386 const auto *
Method = dyn_cast<CXXMethodDecl>(ND);
1388 return canCxxMethodBeCalled(
Method, BaseExprType);
1395 NamedDecl *Hiding,
bool InBaseClass =
false,
1397 bool IsInDeclarationContext =
false,
1398 bool IsAddressOfOperand =
false) {
1399 if (
R.Kind != Result::RK_Declaration) {
1401 Results.push_back(R);
1406 if (
const auto *Using = dyn_cast<UsingShadowDecl>(
R.Declaration)) {
1408 getBasePriority(
Using->getTargetDecl()),
1412 std::move(
R.FixIts));
1414 AddResult(
Result, CurContext, Hiding,
false,
1419 bool AsNestedNameSpecifier =
false;
1420 if (!isInterestingDecl(
R.Declaration, AsNestedNameSpecifier))
1427 if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
1431 if (!AllDeclsFound.insert(
R.Declaration->getCanonicalDecl()).second)
1436 if (AsNestedNameSpecifier) {
1437 R.StartsNestedNameSpecifier =
true;
1439 }
else if (Filter == &ResultBuilder::IsMember && !
R.Qualifier &&
1442 R.Declaration->getDeclContext()->getRedeclContext()))
1443 R.QualifierIsInformative =
true;
1446 if (
R.QualifierIsInformative && !
R.Qualifier &&
1447 !
R.StartsNestedNameSpecifier) {
1448 const DeclContext *Ctx =
R.Declaration->getDeclContext();
1449 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1452 else if (
const auto *Tag = dyn_cast<TagDecl>(Ctx))
1456 std::nullopt, Tag,
false)
1459 R.QualifierIsInformative =
false;
1466 AdjustResultPriorityForDecl(R);
1469 const auto GetQualifiers = [&](
const CXXMethodDecl *MethodDecl) {
1470 if (MethodDecl->isExplicitObjectMemberFunction())
1471 return MethodDecl->getFunctionObjectParameterType().getQualifiers();
1473 return MethodDecl->getMethodQualifiers();
1476 if (IsExplicitObjectMemberFunction &&
1485 if (HasObjectTypeQualifiers)
1486 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
R.Declaration))
1487 if (
Method->isInstance()) {
1489 if (ObjectTypeQualifiers == MethodQuals)
1491 else if (ObjectTypeQualifiers - MethodQuals) {
1497 switch (
Method->getRefQualifier()) {
1514 CurContext,
Method->getDeclName().getAsOpaqueInteger())];
1516 Result &Incumbent = Results[Entry.second];
1519 ObjectTypeQualifiers, ObjectKind,
1525 Incumbent = std::move(R);
1536 R.DeclaringEntity = IsInDeclarationContext;
1537 R.FunctionCanBeCall =
1538 canFunctionBeCalled(
R.getDeclaration(), BaseExprType) &&
1542 !IsAddressOfOperand;
1545 Results.push_back(R);
1547 if (!AsNestedNameSpecifier)
1548 MaybeAddConstructorResults(R);
1551void ResultBuilder::AddResult(
Result R) {
1552 assert(
R.Kind != Result::RK_Declaration &&
1553 "Declaration results need more context");
1554 Results.push_back(R);
1558void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
1561void ResultBuilder::ExitScope() {
1562 ShadowMaps.pop_back();
1567bool ResultBuilder::IsOrdinaryName(
const NamedDecl *ND)
const {
1585bool ResultBuilder::IsOrdinaryNonTypeName(
const NamedDecl *ND)
const {
1592 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
1593 if (!
ID->getDefinition())
1608bool ResultBuilder::IsIntegralConstantValue(
const NamedDecl *ND)
const {
1609 if (!IsOrdinaryNonTypeName(ND))
1613 if (VD->getType()->isIntegralOrEnumerationType())
1621bool ResultBuilder::IsOrdinaryNonValueName(
const NamedDecl *ND)
const {
1634bool ResultBuilder::IsNestedNameSpecifier(
const NamedDecl *ND)
const {
1636 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1637 ND = ClassTemplate->getTemplatedDecl();
1643bool ResultBuilder::IsEnum(
const NamedDecl *ND)
const {
1648bool ResultBuilder::IsClassOrStruct(
const NamedDecl *ND)
const {
1650 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1651 ND = ClassTemplate->getTemplatedDecl();
1654 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1663bool ResultBuilder::IsUnion(
const NamedDecl *ND)
const {
1665 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1666 ND = ClassTemplate->getTemplatedDecl();
1668 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1675bool ResultBuilder::IsNamespace(
const NamedDecl *ND)
const {
1681bool ResultBuilder::IsNamespaceOrAlias(
const NamedDecl *ND)
const {
1686bool ResultBuilder::IsType(
const NamedDecl *ND)
const {
1694bool ResultBuilder::IsMember(
const NamedDecl *ND)
const {
1702bool ResultBuilder::IsOffsetofField(
const NamedDecl *ND)
const {
1704 if (
const auto *FD = dyn_cast<FieldDecl>(ND))
1705 return !FD->isBitField();
1706 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(ND))
1707 return !IFD->getAnonField()->isBitField();
1712 T =
C.getCanonicalType(T);
1713 switch (T->getTypeClass()) {
1714 case Type::ObjCObject:
1715 case Type::ObjCInterface:
1716 case Type::ObjCObjectPointer:
1721 case BuiltinType::ObjCId:
1722 case BuiltinType::ObjCClass:
1723 case BuiltinType::ObjCSel:
1735 if (!
C.getLangOpts().CPlusPlus)
1741 return T->isDependentType() || T->isRecordType();
1744bool ResultBuilder::IsObjCMessageReceiver(
const NamedDecl *ND)
const {
1754bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
1756 if (IsObjCMessageReceiver(ND))
1759 const auto *Var = dyn_cast<VarDecl>(ND);
1763 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
1766bool ResultBuilder::IsObjCCollection(
const NamedDecl *ND)
const {
1767 if ((SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
1768 (!SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1782bool ResultBuilder::IsImpossibleToSatisfy(
const NamedDecl *ND)
const {
1788bool ResultBuilder::IsObjCIvar(
const NamedDecl *ND)
const {
1797 ResultBuilder &Results;
1798 DeclContext *InitialLookupCtx;
1801 CXXRecordDecl *NamingClass;
1803 std::vector<FixItHint> FixIts;
1804 bool IsInDeclarationContext;
1806 bool IsAddressOfOperand;
1809 CodeCompletionDeclConsumer(
1810 ResultBuilder &Results, DeclContext *InitialLookupCtx,
1811 QualType BaseType = QualType(),
1812 std::vector<FixItHint> FixIts = std::vector<FixItHint>())
1813 : Results(Results), InitialLookupCtx(InitialLookupCtx),
1814 FixIts(std::move(FixIts)), IsInDeclarationContext(
false),
1815 IsAddressOfOperand(
false) {
1816 NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
1819 auto ThisType = Results.getSema().getCurrentThisType();
1820 if (!ThisType.isNull()) {
1821 assert(ThisType->isPointerType());
1827 this->BaseType = BaseType;
1830 void setIsInDeclarationContext(
bool IsInDeclarationContext) {
1831 this->IsInDeclarationContext = IsInDeclarationContext;
1834 void setIsAddressOfOperand(
bool IsAddressOfOperand) {
1835 this->IsAddressOfOperand = IsAddressOfOperand;
1838 void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
1839 bool InBaseClass)
override {
1840 ResultBuilder::Result
Result(ND, Results.getBasePriority(ND),
1844 Results.AddResult(
Result, InitialLookupCtx, Hiding, InBaseClass, BaseType,
1845 IsInDeclarationContext, IsAddressOfOperand);
1848 void EnteredContext(DeclContext *Ctx)
override {
1849 Results.addVisitedContext(Ctx);
1858 auto *NamingClass = this->NamingClass;
1859 QualType BaseType = this->BaseType;
1860 if (
auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
1869 BaseType = QualType();
1875 NamingClass =
nullptr;
1876 BaseType = QualType();
1878 return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
1885 ResultBuilder &Results) {
1912 Results.getCodeCompletionTUInfo());
1913 if (LangOpts.CPlusPlus) {
1921 Builder.AddTypedTextChunk(
"typename");
1923 Builder.AddPlaceholderChunk(
"name");
1924 Results.AddResult(
Result(Builder.TakeString()));
1926 if (LangOpts.CPlusPlus11) {
1931 Builder.AddTypedTextChunk(
"decltype");
1933 Builder.AddPlaceholderChunk(
"expression");
1935 Results.AddResult(
Result(Builder.TakeString()));
1938 if (LangOpts.Char8 || LangOpts.CPlusPlus20)
1944 if (LangOpts.GNUKeywords) {
1950 Builder.AddTypedTextChunk(
"typeof");
1952 Builder.AddPlaceholderChunk(
"expression");
1953 Results.AddResult(
Result(Builder.TakeString()));
1955 Builder.AddTypedTextChunk(
"typeof");
1957 Builder.AddPlaceholderChunk(
"type");
1959 Results.AddResult(
Result(Builder.TakeString()));
1970 const LangOptions &LangOpts, ResultBuilder &Results) {
1975 Results.AddResult(
Result(
"extern"));
1976 Results.AddResult(
Result(
"static"));
1978 if (LangOpts.CPlusPlus11) {
1983 Builder.AddTypedTextChunk(
"alignas");
1985 Builder.AddPlaceholderChunk(
"expression");
1987 Results.AddResult(
Result(Builder.TakeString()));
1989 Results.AddResult(
Result(
"constexpr"));
1990 Results.AddResult(
Result(
"thread_local"));
1993 if (LangOpts.CPlusPlus20)
1994 Results.AddResult(
Result(
"constinit"));
1999 const LangOptions &LangOpts, ResultBuilder &Results) {
2004 if (LangOpts.CPlusPlus) {
2005 Results.AddResult(
Result(
"explicit"));
2006 Results.AddResult(
Result(
"friend"));
2007 Results.AddResult(
Result(
"mutable"));
2008 Results.AddResult(
Result(
"virtual"));
2016 if (LangOpts.CPlusPlus || LangOpts.C99)
2017 Results.AddResult(
Result(
"inline"));
2019 if (LangOpts.CPlusPlus20)
2020 Results.AddResult(
Result(
"consteval"));
2040 ResultBuilder &Results,
bool NeedAt);
2042 ResultBuilder &Results,
bool NeedAt);
2044 ResultBuilder &Results,
bool NeedAt);
2049 Results.getCodeCompletionTUInfo());
2050 Builder.AddTypedTextChunk(
"typedef");
2052 Builder.AddPlaceholderChunk(
"type");
2054 Builder.AddPlaceholderChunk(
"name");
2061 ResultBuilder &Results) {
2062 Builder.AddTypedTextChunk(
"using");
2064 Builder.AddPlaceholderChunk(
"name");
2066 Builder.AddPlaceholderChunk(
"type");
2089 return LangOpts.CPlusPlus;
2096 return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
2099 llvm_unreachable(
"Invalid ParserCompletionContext!");
2126 if (!T.getLocalQualifiers()) {
2128 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(T))
2129 return BT->getNameAsCString(Policy);
2132 if (
const TagType *TagT = dyn_cast<TagType>(T))
2133 if (
TagDecl *Tag = TagT->getDecl())
2134 if (!Tag->hasNameForLinkage()) {
2135 switch (Tag->getTagKind()) {
2137 return "struct <anonymous>";
2139 return "__interface <anonymous>";
2141 return "class <anonymous>";
2143 return "union <anonymous>";
2145 return "enum <anonymous>";
2152 T.getAsStringInternal(
Result, Policy);
2165 Builder.AddResultTypeChunk(
2167 Builder.AddTypedTextChunk(
"this");
2172 ResultBuilder &Results,
2174 if (!LangOpts.CPlusPlus11)
2177 Builder.AddTypedTextChunk(
"static_assert");
2179 Builder.AddPlaceholderChunk(
"expression");
2181 Builder.AddPlaceholderChunk(
"message");
2190 Sema &S = Results.getSema();
2191 const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.
CurContext);
2197 llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
2198 for (
auto *Method : CR->methods()) {
2199 if (!Method->isVirtual() || !Method->getIdentifier())
2201 Overrides[Method->getName()].push_back(Method);
2204 for (
const auto &
Base : CR->bases()) {
2205 const auto *BR =
Base.getType().getTypePtr()->getAsCXXRecordDecl();
2208 for (
auto *Method : BR->methods()) {
2209 if (!Method->isVirtual() || !Method->getIdentifier())
2211 const auto it = Overrides.find(Method->getName());
2212 bool IsOverriden =
false;
2213 if (it != Overrides.end()) {
2214 for (
auto *MD : it->second) {
2232 false, CCContext, Policy);
2242 Scope *S,
Sema &SemaRef, ResultBuilder &Results) {
2250 if (Results.includeCodePatterns()) {
2252 Builder.AddTypedTextChunk(
"namespace");
2254 Builder.AddPlaceholderChunk(
"identifier");
2258 Builder.AddPlaceholderChunk(
"declarations");
2261 Results.AddResult(
Result(Builder.TakeString()));
2265 Builder.AddTypedTextChunk(
"namespace");
2267 Builder.AddPlaceholderChunk(
"name");
2269 Builder.AddPlaceholderChunk(
"namespace");
2271 Results.AddResult(
Result(Builder.TakeString()));
2274 Builder.AddTypedTextChunk(
"using namespace");
2276 Builder.AddPlaceholderChunk(
"identifier");
2278 Results.AddResult(
Result(Builder.TakeString()));
2281 Builder.AddTypedTextChunk(
"asm");
2283 Builder.AddPlaceholderChunk(
"string-literal");
2285 Results.AddResult(
Result(Builder.TakeString()));
2287 if (Results.includeCodePatterns()) {
2289 Builder.AddTypedTextChunk(
"template");
2291 Builder.AddPlaceholderChunk(
"declaration");
2292 Results.AddResult(
Result(Builder.TakeString()));
2303 if (!CurrentModule) {
2305 Builder.AddTypedTextChunk(
"module");
2308 Results.AddResult(
Result(Builder.TakeString()));
2313 if (!CurrentModule ||
2318 Builder.AddTypedTextChunk(
"module");
2320 Builder.AddPlaceholderChunk(
"name");
2323 Results.AddResult(
Result(Builder.TakeString()));
2328 if (!CurrentModule ||
2332 Builder.AddTypedTextChunk(
"import");
2334 Builder.AddPlaceholderChunk(
"name");
2337 Results.AddResult(
Result(Builder.TakeString()));
2340 if (CurrentModule &&
2344 Builder.AddTypedTextChunk(
"module");
2347 Builder.AddTypedTextChunk(
"private");
2350 Results.AddResult(
Result(Builder.TakeString()));
2355 if (!CurrentModule ||
2370 Builder.AddTypedTextChunk(
"using");
2372 Builder.AddPlaceholderChunk(
"qualifier");
2373 Builder.AddTextChunk(
"::");
2374 Builder.AddPlaceholderChunk(
"name");
2376 Results.AddResult(
Result(Builder.TakeString()));
2383 Builder.AddTypedTextChunk(
"using typename");
2385 Builder.AddPlaceholderChunk(
"qualifier");
2386 Builder.AddTextChunk(
"::");
2387 Builder.AddPlaceholderChunk(
"name");
2389 Results.AddResult(
Result(Builder.TakeString()));
2399 Builder.AddTypedTextChunk(
"public");
2400 if (IsNotInheritanceScope && Results.includeCodePatterns())
2402 Results.AddResult(
Result(Builder.TakeString()));
2405 Builder.AddTypedTextChunk(
"protected");
2406 if (IsNotInheritanceScope && Results.includeCodePatterns())
2408 Results.AddResult(
Result(Builder.TakeString()));
2411 Builder.AddTypedTextChunk(
"private");
2412 if (IsNotInheritanceScope && Results.includeCodePatterns())
2414 Results.AddResult(
Result(Builder.TakeString()));
2432 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
2434 Builder.AddTypedTextChunk(
"template");
2436 Builder.AddPlaceholderChunk(
"parameters");
2438 Results.AddResult(
Result(Builder.TakeString()));
2476 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
2478 Builder.AddTypedTextChunk(
"try");
2482 Builder.AddPlaceholderChunk(
"statements");
2486 Builder.AddTextChunk(
"catch");
2489 Builder.AddPlaceholderChunk(
"declaration");
2494 Builder.AddPlaceholderChunk(
"statements");
2497 Results.AddResult(
Result(Builder.TakeString()));
2502 if (Results.includeCodePatterns()) {
2504 Builder.AddTypedTextChunk(
"if");
2508 Builder.AddPlaceholderChunk(
"condition");
2510 Builder.AddPlaceholderChunk(
"expression");
2515 Builder.AddPlaceholderChunk(
"statements");
2518 Results.AddResult(
Result(Builder.TakeString()));
2521 Builder.AddTypedTextChunk(
"switch");
2525 Builder.AddPlaceholderChunk(
"condition");
2527 Builder.AddPlaceholderChunk(
"expression");
2532 Builder.AddPlaceholderChunk(
"cases");
2535 Results.AddResult(
Result(Builder.TakeString()));
2542 Builder.AddTypedTextChunk(
"case");
2544 Builder.AddPlaceholderChunk(
"expression");
2546 Results.AddResult(
Result(Builder.TakeString()));
2549 Builder.AddTypedTextChunk(
"default");
2551 Results.AddResult(
Result(Builder.TakeString()));
2554 if (Results.includeCodePatterns()) {
2556 Builder.AddTypedTextChunk(
"while");
2560 Builder.AddPlaceholderChunk(
"condition");
2562 Builder.AddPlaceholderChunk(
"expression");
2567 Builder.AddPlaceholderChunk(
"statements");
2570 Results.AddResult(
Result(Builder.TakeString()));
2573 Builder.AddTypedTextChunk(
"do");
2577 Builder.AddPlaceholderChunk(
"statements");
2580 Builder.AddTextChunk(
"while");
2583 Builder.AddPlaceholderChunk(
"expression");
2585 Results.AddResult(
Result(Builder.TakeString()));
2588 Builder.AddTypedTextChunk(
"for");
2592 Builder.AddPlaceholderChunk(
"init-statement");
2594 Builder.AddPlaceholderChunk(
"init-expression");
2597 Builder.AddPlaceholderChunk(
"condition");
2600 Builder.AddPlaceholderChunk(
"inc-expression");
2605 Builder.AddPlaceholderChunk(
"statements");
2608 Results.AddResult(
Result(Builder.TakeString()));
2612 Builder.AddTypedTextChunk(
"for");
2615 Builder.AddPlaceholderChunk(
"range-declaration");
2618 Builder.AddTextChunk(
"in");
2622 Builder.AddPlaceholderChunk(
"range-expression");
2627 Builder.AddPlaceholderChunk(
"statements");
2630 Results.AddResult(
Result(Builder.TakeString()));
2636 Builder.AddTypedTextChunk(
"continue");
2638 Results.AddResult(
Result(Builder.TakeString()));
2643 Builder.AddTypedTextChunk(
"break");
2645 Results.AddResult(
Result(Builder.TakeString()));
2650 if (
const auto *Function = dyn_cast<FunctionDecl>(SemaRef.
CurContext)) {
2651 if (!Function->getType().isNull())
2652 ReturnType = Function->getReturnType();
2653 }
else if (
const auto *Method =
2654 dyn_cast<ObjCMethodDecl>(SemaRef.
CurContext))
2655 ReturnType = Method->getReturnType();
2660 Builder.AddTypedTextChunk(
"return");
2662 Results.AddResult(
Result(Builder.TakeString()));
2664 assert(!ReturnType.
isNull());
2666 Builder.AddTypedTextChunk(
"return");
2668 Builder.AddPlaceholderChunk(
"expression");
2670 Results.AddResult(
Result(Builder.TakeString()));
2673 Builder.AddTypedTextChunk(
"co_return");
2675 Builder.AddPlaceholderChunk(
"expression");
2677 Results.AddResult(
Result(Builder.TakeString()));
2681 Builder.AddTypedTextChunk(
"return true");
2683 Results.AddResult(
Result(Builder.TakeString()));
2685 Builder.AddTypedTextChunk(
"return false");
2687 Results.AddResult(
Result(Builder.TakeString()));
2692 Builder.AddTypedTextChunk(
"return nullptr");
2694 Results.AddResult(
Result(Builder.TakeString()));
2699 Builder.AddTypedTextChunk(
"goto");
2701 Builder.AddPlaceholderChunk(
"label");
2703 Results.AddResult(
Result(Builder.TakeString()));
2706 Builder.AddTypedTextChunk(
"using namespace");
2708 Builder.AddPlaceholderChunk(
"identifier");
2710 Results.AddResult(
Result(Builder.TakeString()));
2727 Builder.AddTypedTextChunk(
"__bridge");
2729 Builder.AddPlaceholderChunk(
"type");
2731 Builder.AddPlaceholderChunk(
"expression");
2732 Results.AddResult(
Result(Builder.TakeString()));
2735 Builder.AddTypedTextChunk(
"__bridge_transfer");
2737 Builder.AddPlaceholderChunk(
"Objective-C type");
2739 Builder.AddPlaceholderChunk(
"expression");
2740 Results.AddResult(
Result(Builder.TakeString()));
2743 Builder.AddTypedTextChunk(
"__bridge_retained");
2745 Builder.AddPlaceholderChunk(
"CF type");
2747 Builder.AddPlaceholderChunk(
"expression");
2748 Results.AddResult(
Result(Builder.TakeString()));
2759 Builder.AddResultTypeChunk(
"bool");
2760 Builder.AddTypedTextChunk(
"true");
2761 Results.AddResult(
Result(Builder.TakeString()));
2764 Builder.AddResultTypeChunk(
"bool");
2765 Builder.AddTypedTextChunk(
"false");
2766 Results.AddResult(
Result(Builder.TakeString()));
2770 Builder.AddTypedTextChunk(
"dynamic_cast");
2772 Builder.AddPlaceholderChunk(
"type");
2775 Builder.AddPlaceholderChunk(
"expression");
2777 Results.AddResult(
Result(Builder.TakeString()));
2781 Builder.AddTypedTextChunk(
"static_cast");
2783 Builder.AddPlaceholderChunk(
"type");
2786 Builder.AddPlaceholderChunk(
"expression");
2788 Results.AddResult(
Result(Builder.TakeString()));
2791 Builder.AddTypedTextChunk(
"reinterpret_cast");
2793 Builder.AddPlaceholderChunk(
"type");
2796 Builder.AddPlaceholderChunk(
"expression");
2798 Results.AddResult(
Result(Builder.TakeString()));
2801 Builder.AddTypedTextChunk(
"const_cast");
2803 Builder.AddPlaceholderChunk(
"type");
2806 Builder.AddPlaceholderChunk(
"expression");
2808 Results.AddResult(
Result(Builder.TakeString()));
2812 Builder.AddResultTypeChunk(
"std::type_info");
2813 Builder.AddTypedTextChunk(
"typeid");
2815 Builder.AddPlaceholderChunk(
"expression-or-type");
2817 Results.AddResult(
Result(Builder.TakeString()));
2821 Builder.AddTypedTextChunk(
"new");
2823 Builder.AddPlaceholderChunk(
"type");
2825 Builder.AddPlaceholderChunk(
"expressions");
2827 Results.AddResult(
Result(Builder.TakeString()));
2830 Builder.AddTypedTextChunk(
"new");
2832 Builder.AddPlaceholderChunk(
"type");
2834 Builder.AddPlaceholderChunk(
"size");
2837 Builder.AddPlaceholderChunk(
"expressions");
2839 Results.AddResult(
Result(Builder.TakeString()));
2842 Builder.AddResultTypeChunk(
"void");
2843 Builder.AddTypedTextChunk(
"delete");
2845 Builder.AddPlaceholderChunk(
"expression");
2846 Results.AddResult(
Result(Builder.TakeString()));
2849 Builder.AddResultTypeChunk(
"void");
2850 Builder.AddTypedTextChunk(
"delete");
2855 Builder.AddPlaceholderChunk(
"expression");
2856 Results.AddResult(
Result(Builder.TakeString()));
2860 Builder.AddResultTypeChunk(
"void");
2861 Builder.AddTypedTextChunk(
"throw");
2863 Builder.AddPlaceholderChunk(
"expression");
2864 Results.AddResult(
Result(Builder.TakeString()));
2871 Builder.AddResultTypeChunk(
"std::nullptr_t");
2872 Builder.AddTypedTextChunk(
"nullptr");
2873 Results.AddResult(
Result(Builder.TakeString()));
2876 Builder.AddResultTypeChunk(
"size_t");
2877 Builder.AddTypedTextChunk(
"alignof");
2879 Builder.AddPlaceholderChunk(
"type");
2881 Results.AddResult(
Result(Builder.TakeString()));
2884 Builder.AddResultTypeChunk(
"bool");
2885 Builder.AddTypedTextChunk(
"noexcept");
2887 Builder.AddPlaceholderChunk(
"expression");
2889 Results.AddResult(
Result(Builder.TakeString()));
2892 Builder.AddResultTypeChunk(
"size_t");
2893 Builder.AddTypedTextChunk(
"sizeof...");
2895 Builder.AddPlaceholderChunk(
"parameter-pack");
2897 Results.AddResult(
Result(Builder.TakeString()));
2902 Builder.AddTypedTextChunk(
"co_await");
2904 Builder.AddPlaceholderChunk(
"expression");
2905 Results.AddResult(
Result(Builder.TakeString()));
2908 Builder.AddTypedTextChunk(
"co_yield");
2910 Builder.AddPlaceholderChunk(
"expression");
2911 Results.AddResult(
Result(Builder.TakeString()));
2914 Builder.AddResultTypeChunk(
"bool");
2915 Builder.AddTypedTextChunk(
"requires");
2918 Builder.AddPlaceholderChunk(
"parameters");
2923 Builder.AddPlaceholderChunk(
"requirements");
2926 Results.AddResult(
Result(Builder.TakeString()));
2930 Builder.AddTypedTextChunk(
"requires");
2932 Builder.AddPlaceholderChunk(
"expression");
2934 Results.AddResult(
Result(Builder.TakeString()));
2944 if (ID->getSuperClass()) {
2945 std::string SuperType;
2946 SuperType = ID->getSuperClass()->getNameAsString();
2947 if (Method->isInstanceMethod())
2950 Builder.AddResultTypeChunk(Allocator.
CopyString(SuperType));
2951 Builder.AddTypedTextChunk(
"super");
2952 Results.AddResult(
Result(Builder.TakeString()));
2961 Builder.AddResultTypeChunk(
"size_t");
2963 Builder.AddTypedTextChunk(
"alignof");
2965 Builder.AddTypedTextChunk(
"_Alignof");
2967 Builder.AddPlaceholderChunk(
"type");
2969 Results.AddResult(
Result(Builder.TakeString()));
2974 Builder.AddResultTypeChunk(
"nullptr_t");
2975 Builder.AddTypedTextChunk(
"nullptr");
2976 Results.AddResult(
Result(Builder.TakeString()));
2980 Builder.AddResultTypeChunk(
"size_t");
2981 Builder.AddTypedTextChunk(
"sizeof");
2983 Builder.AddPlaceholderChunk(
"expression-or-type");
2985 Results.AddResult(
Result(Builder.TakeString()));
2998 Results.AddResult(
Result(
"operator"));
3018 T = Function->getReturnType();
3019 else if (
const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
3020 if (!BaseType.isNull())
3021 T = Method->getSendResultType(BaseType);
3023 T = Method->getReturnType();
3024 }
else if (
const auto *
Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
3025 T = Context.getCanonicalTagType(
3029 }
else if (
const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
3030 if (!BaseType.isNull())
3031 T = Ivar->getUsageType(BaseType);
3033 T = Ivar->getType();
3034 }
else if (
const auto *
Value = dyn_cast<ValueDecl>(ND)) {
3036 }
else if (
const auto *Property = dyn_cast<ObjCPropertyDecl>(ND)) {
3037 if (!BaseType.isNull())
3038 T = Property->getUsageType(BaseType);
3040 T = Property->getType();
3043 if (T.isNull() || Context.hasSameType(T, Context.DependentTy))
3046 Result.AddResultTypeChunk(
3053 if (SentinelAttr *Sentinel = FunctionOrMethod->
getAttr<SentinelAttr>())
3054 if (Sentinel->getSentinel() == 0) {
3056 Result.AddTextChunk(
", nil");
3058 Result.AddTextChunk(
", NULL");
3060 Result.AddTextChunk(
", (void*)0");
3080 if (
auto nullability = AttributedType::stripOuterNullability(
Type)) {
3081 switch (*nullability) {
3091 Result +=
"null_unspecified ";
3095 llvm_unreachable(
"Not supported as a context-sensitive keyword!");
3112 bool SuppressBlock =
false) {
3118 if (!SuppressBlock) {
3121 TypedefTL.getDecl()->getTypeSourceInfo()) {
3134 TL = AttrTL.getModifiedLoc();
3153 bool SuppressBlockName =
false,
bool SuppressBlock =
false,
3158 bool SuppressName =
false,
bool SuppressBlock =
false,
3166 if (
const auto *PVD = dyn_cast<ParmVarDecl>(Param))
3167 ObjCQual = PVD->getObjCDeclQualifier();
3169 if (Param->getType()->isDependentType() ||
3170 !Param->getType()->isBlockPointerType()) {
3175 if (Param->getIdentifier() && !ObjCMethodParam && !SuppressName)
3176 Result = std::string(Param->getIdentifier()->deuglifiedName());
3180 Type =
Type.substObjCTypeArgs(Param->getASTContext(), *ObjCSubsts,
3182 if (ObjCMethodParam) {
3185 if (Param->getIdentifier() && !SuppressName)
3186 Result += Param->getIdentifier()->deuglifiedName();
3201 if (!
Block && ObjCMethodParam &&
3204 ->findPropertyDecl(
false))
3213 if (!ObjCMethodParam && Param->getIdentifier())
3214 Result = std::string(Param->getIdentifier()->deuglifiedName());
3218 if (ObjCMethodParam) {
3223 if (
Result.back() !=
')')
3225 if (Param->getIdentifier())
3226 Result += Param->getIdentifier()->deuglifiedName();
3237 false, SuppressBlock,
3253 bool SuppressBlockName,
bool SuppressBlock,
3261 if (!ResultType->
isVoidType() || SuppressBlock)
3266 if (!BlockProto ||
Block.getNumParams() == 0) {
3273 for (
unsigned I = 0, N =
Block.getNumParams(); I != N; ++I) {
3286 if (SuppressBlock) {
3289 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3298 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3308 const SourceRange SrcRange = Param->getDefaultArgRange();
3318 if (srcText.empty() || srcText ==
"=") {
3324 std::string DefValue(srcText.str());
3327 if (DefValue.at(0) !=
'=') {
3331 return " = " + DefValue;
3333 return " " + DefValue;
3340 unsigned Start = 0,
bool InOptional =
false,
bool FunctionCanBeCall =
true,
3341 bool IsInDeclarationContext =
false) {
3342 bool FirstParameter =
true;
3343 bool AsInformativeChunk = !(FunctionCanBeCall || IsInDeclarationContext);
3345 const FunctionDecl *BetterSignatureDecl = BetterSignature(Function, Start);
3347 for (
unsigned P = Start, N = Function->getNumParams(); P != N; ++P) {
3350 if (Param->hasDefaultArg() && !InOptional && !IsInDeclarationContext &&
3351 !AsInformativeChunk) {
3355 Result.getCodeCompletionTUInfo());
3356 if (!FirstParameter)
3366 if (FirstParameter && Param->isExplicitObjectParameter()) {
3371 FirstParameter =
false;
3373 if (AsInformativeChunk)
3374 Result.AddInformativeChunk(
", ");
3383 std::string DefaultValue;
3384 if (Param->hasDefaultArg()) {
3385 if (IsInDeclarationContext)
3393 if (Function->isVariadic() && P == N - 1)
3394 PlaceholderStr +=
", ...";
3397 if (AsInformativeChunk)
3398 Result.AddInformativeChunk(
3399 Result.getAllocator().CopyString(PlaceholderStr));
3400 else if (IsInDeclarationContext) {
3401 Result.AddTextChunk(
Result.getAllocator().CopyString(PlaceholderStr));
3402 if (DefaultValue.length() != 0)
3403 Result.AddInformativeChunk(
3404 Result.getAllocator().CopyString(DefaultValue));
3406 Result.AddPlaceholderChunk(
3407 Result.getAllocator().CopyString(PlaceholderStr));
3411 if (Proto->isVariadic()) {
3412 if (Proto->getNumParams() == 0)
3413 Result.AddPlaceholderChunk(
"...");
3423 unsigned MaxParameters = 0,
unsigned Start = 0,
bool InDefaultArg =
false,
3424 bool AsInformativeChunk =
false) {
3425 bool FirstParameter =
true;
3434 PEnd = Params->
begin() + MaxParameters;
3437 bool HasDefaultArg =
false;
3438 std::string PlaceholderStr;
3440 if (TTP->wasDeclaredWithTypename())
3441 PlaceholderStr =
"typename";
3442 else if (
const auto *TC = TTP->getTypeConstraint()) {
3443 llvm::raw_string_ostream OS(PlaceholderStr);
3444 TC->print(OS, Policy);
3446 PlaceholderStr =
"class";
3448 if (TTP->getIdentifier()) {
3449 PlaceholderStr +=
' ';
3450 PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3453 HasDefaultArg = TTP->hasDefaultArgument();
3455 dyn_cast<NonTypeTemplateParmDecl>(*P)) {
3456 if (NTTP->getIdentifier())
3457 PlaceholderStr = std::string(NTTP->getIdentifier()->deuglifiedName());
3458 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3459 HasDefaultArg = NTTP->hasDefaultArgument();
3466 PlaceholderStr =
"template<...> class";
3468 PlaceholderStr +=
' ';
3475 if (HasDefaultArg && !InDefaultArg && !AsInformativeChunk) {
3479 Result.getCodeCompletionTUInfo());
3480 if (!FirstParameter)
3483 P - Params->
begin(),
true);
3488 InDefaultArg =
false;
3491 FirstParameter =
false;
3493 if (AsInformativeChunk)
3494 Result.AddInformativeChunk(
", ");
3499 if (AsInformativeChunk)
3500 Result.AddInformativeChunk(
3501 Result.getAllocator().CopyString(PlaceholderStr));
3503 Result.AddPlaceholderChunk(
3504 Result.getAllocator().CopyString(PlaceholderStr));
3512 bool QualifierIsInformative,
3518 std::string PrintedNNS;
3520 llvm::raw_string_ostream OS(PrintedNNS);
3521 Qualifier.print(OS, Policy);
3523 if (QualifierIsInformative)
3524 Result.AddInformativeChunk(
Result.getAllocator().CopyString(PrintedNNS));
3526 Result.AddTextChunk(
Result.getAllocator().CopyString(PrintedNNS));
3531 bool AsInformativeChunk =
true) {
3536 if (AsInformativeChunk)
3537 Result.AddInformativeChunk(
" const");
3539 Result.AddTextChunk(
" const");
3544 if (AsInformativeChunk)
3545 Result.AddInformativeChunk(
" volatile");
3547 Result.AddTextChunk(
" volatile");
3552 if (AsInformativeChunk)
3553 Result.AddInformativeChunk(
" restrict");
3555 Result.AddTextChunk(
" restrict");
3560 std::string QualsStr;
3562 QualsStr +=
" const";
3564 QualsStr +=
" volatile";
3566 QualsStr +=
" restrict";
3568 if (AsInformativeChunk)
3569 Result.AddInformativeChunk(
Result.getAllocator().CopyString(QualsStr));
3571 Result.AddTextChunk(
Result.getAllocator().CopyString(QualsStr));
3577 bool AsInformativeChunks =
true) {
3578 if (
auto *CxxMethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(Function);
3579 CxxMethodDecl && CxxMethodDecl->hasCXXExplicitFunctionObjectParameter()) {
3581 const auto Quals = CxxMethodDecl->getFunctionObjectParameterType();
3582 if (!Quals.hasQualifiers())
3588 if (!Proto || !Proto->getMethodQuals())
3603 switch (ExceptInfo.Type) {
3606 NameAndSignature +=
" noexcept";
3624 const char *OperatorName =
nullptr;
3627 case OO_Conditional:
3629 OperatorName =
"operator";
3632#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
3634 OperatorName = "operator" Spelling; \
3636#define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3637#include "clang/Basic/OperatorKinds.def"
3640 OperatorName =
"operator new";
3643 OperatorName =
"operator delete";
3646 OperatorName =
"operator new[]";
3648 case OO_Array_Delete:
3649 OperatorName =
"operator delete[]";
3652 OperatorName =
"operator()";
3655 OperatorName =
"operator[]";
3658 Result.AddTypedTextChunk(OperatorName);
3666 Result.AddTypedTextChunk(
3683 Result.AddTypedTextChunk(
3688 Result.AddTypedTextChunk(
3689 Result.getAllocator().CopyString(
Record->getNameAsString()));
3703 bool IncludeBriefComments) {
3705 CCTUInfo, IncludeBriefComments);
3717 return Result.TakeString();
3728 Result.AddPlaceholderChunk(
"...");
3742 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
3747 Result.AddPlaceholderChunk(
3748 Result.getAllocator().CopyString((*A)->getName()));
3751 return Result.TakeString();
3763 bool IncludeBriefComments) {
3779 Result.addBriefComment(RC->getBriefText(Ctx));
3789 return Result.TakeString();
3793 PP, Ctx,
Result, IncludeBriefComments, CCContext, Policy);
3797 std::string &BeforeName,
3798 std::string &NameAndSignature) {
3799 bool SeenTypedChunk =
false;
3800 for (
auto &Chunk : CCS) {
3802 assert(SeenTypedChunk &&
"optional parameter before name");
3809 NameAndSignature += Chunk.Text;
3811 BeforeName += Chunk.Text;
3823 std::string BeforeName;
3824 std::string NameAndSignature;
3830 const auto *VirtualFunc = dyn_cast<FunctionDecl>(
Declaration);
3831 assert(VirtualFunc &&
"overridden decl must be a function");
3834 NameAndSignature +=
" override";
3836 Result.AddTextChunk(
Result.getAllocator().CopyString(BeforeName));
3838 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(NameAndSignature));
3839 return Result.TakeString();
3845 const auto *VD = dyn_cast<VarDecl>(ND);
3848 const auto *
RecordDecl = VD->getType()->getAsCXXRecordDecl();
3861 if (IncludeBriefComments) {
3864 Result.addBriefComment(RC->getBriefText(Ctx));
3869 Result.AddTypedTextChunk(
3871 Result.AddTextChunk(
"::");
3872 return Result.TakeString();
3876 Result.AddAnnotation(
Result.getAllocator().CopyString(I->getAnnotation()));
3884 if (InsertParameters)
3887 Result.AddInformativeChunk(
"(");
3892 if (InsertParameters)
3895 Result.AddInformativeChunk(
")");
3900 if (
const auto *
Function = dyn_cast<FunctionDecl>(ND)) {
3901 AddFunctionTypeAndResult(
Function);
3902 return Result.TakeString();
3905 if (
const auto *CallOperator =
3907 AddFunctionTypeAndResult(CallOperator);
3908 return Result.TakeString();
3914 dyn_cast<FunctionTemplateDecl>(ND)) {
3925 llvm::SmallBitVector
Deduced(FunTmpl->getTemplateParameters()->size());
3930 unsigned LastDeducibleArgument;
3931 for (LastDeducibleArgument =
Deduced.size(); LastDeducibleArgument > 0;
3932 --LastDeducibleArgument) {
3933 if (!
Deduced[LastDeducibleArgument - 1]) {
3937 bool HasDefaultArg =
false;
3938 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3939 LastDeducibleArgument - 1);
3941 HasDefaultArg = TTP->hasDefaultArgument();
3943 dyn_cast<NonTypeTemplateParmDecl>(Param))
3944 HasDefaultArg = NTTP->hasDefaultArgument();
3972 Result.AddInformativeChunk(
"<");
3974 Ctx, Policy, FunTmpl,
Result, LastDeducibleArgument, 0,
3981 Result.AddInformativeChunk(
">");
3986 if (InsertParameters)
3989 Result.AddInformativeChunk(
"(");
3994 if (InsertParameters)
3997 Result.AddInformativeChunk(
")");
3999 return Result.TakeString();
4002 if (
const auto *
Template = dyn_cast<TemplateDecl>(ND)) {
4005 Result.AddTypedTextChunk(
4010 return Result.TakeString();
4013 if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(ND)) {
4016 Result.AddTypedTextChunk(
4018 return Result.TakeString();
4024 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(SelName));
4026 Result.AddInformativeChunk(
Result.getAllocator().CopyString(SelName));
4030 if (
Method->param_size() == 1)
4031 Result.AddTypedTextChunk(
"");
4037 PEnd =
Method->param_end();
4038 P != PEnd && Idx < Sel.
getNumArgs(); (
void)++P, ++Idx) {
4057 QualType ParamType = (*P)->getType();
4058 std::optional<ArrayRef<QualType>> ObjCSubsts;
4074 Arg += II->getName();
4077 if (
Method->isVariadic() && (P + 1) == PEnd)
4081 Result.AddTextChunk(
Result.getAllocator().CopyString(Arg));
4083 Result.AddInformativeChunk(
Result.getAllocator().CopyString(Arg));
4085 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
4088 if (
Method->isVariadic()) {
4089 if (
Method->param_size() == 0) {
4091 Result.AddTextChunk(
", ...");
4093 Result.AddInformativeChunk(
", ...");
4095 Result.AddPlaceholderChunk(
", ...");
4101 return Result.TakeString();
4108 Result.AddTypedTextChunk(
4110 return Result.TakeString();
4121 const auto *M = dyn_cast<ObjCMethodDecl>(ND);
4133 const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
4134 if (!M || !M->isPropertyAccessor())
4157 auto FDecl =
Result.getFunction();
4160 if (ArgIndex < FDecl->getNumParams())
4168 unsigned CurrentArg) {
4169 unsigned ChunkIndex = 0;
4170 auto AddChunk = [&](llvm::StringRef Placeholder) {
4173 const char *
Copy =
Result.getAllocator().CopyString(Placeholder);
4174 if (ChunkIndex == CurrentArg)
4182 if (
auto *CRD = llvm::dyn_cast<CXXRecordDecl>(RD)) {
4183 for (
const auto &
Base : CRD->bases())
4184 AddChunk(
Base.getType().getAsString(Policy));
4186 for (
const auto &Field : RD->
fields())
4196 unsigned CurrentArg,
unsigned Start = 0,
bool InOptional =
false) {
4202 bool FirstParameter =
true;
4203 unsigned NumParams =
4204 Function ? Function->getNumParams() :
Prototype->getNumParams();
4206 Function ? BetterSignature(Function, Start) :
nullptr;
4208 for (
unsigned P = Start; P != NumParams; ++P) {
4209 if (Function && Function->getParamDecl(P)->hasDefaultArg() && !InOptional) {
4213 Result.getCodeCompletionTUInfo());
4214 if (!FirstParameter)
4218 PrototypeLoc, Opt, CurrentArg, P,
4227 if (Function && FirstParameter &&
4228 Function->getParamDecl(P)->isExplicitObjectParameter()) {
4233 FirstParameter =
false;
4240 std::string Placeholder;
4241 assert(P < Prototype->getNumParams());
4242 if (Function || PrototypeLoc) {
4246 if (Param->hasDefaultArg())
4248 Context.getLangOpts());
4250 Placeholder =
Prototype->getParamType(P).getAsString(Policy);
4253 if (P == CurrentArg)
4254 Result.AddCurrentParameterChunk(
4255 Result.getAllocator().CopyString(Placeholder));
4257 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Placeholder));
4262 Result.getCodeCompletionTUInfo());
4263 if (!FirstParameter)
4266 if (CurrentArg < NumParams)
4278 if (
const auto *
Type = dyn_cast<TemplateTypeParmDecl>(Param)) {
4280 }
else if (
const auto *
NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
4282 }
else if (
const auto *
Template = dyn_cast<TemplateTemplateParmDecl>(Param)) {
4286 llvm::raw_string_ostream OS(
Result);
4287 Param->print(OS, Policy);
4293 if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(TD))
4294 return CTD->getTemplatedDecl()->getKindName().str();
4295 if (
const auto *VTD = dyn_cast<VarTemplateDecl>(TD))
4296 return VTD->getTemplatedDecl()->getType().getAsString(Policy);
4297 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
4298 return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy);
4313 Builder.getCodeCompletionTUInfo());
4315 if (!ResultType.empty())
4316 Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType));
4317 Builder.AddTextChunk(
4323 for (
unsigned I = 0; I < Params.size(); ++I) {
4325 std::string Placeholder =
4328 Current = &OptionalBuilder;
4337 if (Current == &OptionalBuilder)
4343 Builder.AddInformativeChunk(
"()");
4344 return Builder.TakeString();
4351 bool Braced)
const {
4375 if (IncludeBriefComments) {
4382 llvm::raw_string_ostream OS(Name);
4384 Result.AddTextChunk(
Result.getAllocator().CopyString(Name));
4387 Result.AddResultTypeChunk(
Result.getAllocator().CopyString(
4402 return Result.TakeString();
4407 bool PreferredTypeIsPointer) {
4411 if (MacroName ==
"nil" || MacroName ==
"NULL" || MacroName ==
"Nil") {
4413 if (PreferredTypeIsPointer)
4417 else if (MacroName ==
"YES" || MacroName ==
"NO" || MacroName ==
"true" ||
4418 MacroName ==
"false")
4421 else if (MacroName ==
"bool")
4434 case Decl::EnumConstant:
4438 case Decl::Function:
4440 case Decl::ObjCCategory:
4442 case Decl::ObjCCategoryImpl:
4444 case Decl::ObjCImplementation:
4447 case Decl::ObjCInterface:
4449 case Decl::ObjCIvar:
4451 case Decl::ObjCMethod:
4455 case Decl::CXXMethod:
4457 case Decl::CXXConstructor:
4459 case Decl::CXXDestructor:
4461 case Decl::CXXConversion:
4463 case Decl::ObjCProperty:
4465 case Decl::ObjCProtocol:
4471 case Decl::TypeAlias:
4473 case Decl::TypeAliasTemplate:
4477 case Decl::Namespace:
4479 case Decl::NamespaceAlias:
4481 case Decl::TemplateTypeParm:
4483 case Decl::NonTypeTemplateParm:
4485 case Decl::TemplateTemplateParm:
4487 case Decl::FunctionTemplate:
4489 case Decl::ClassTemplate:
4491 case Decl::AccessSpec:
4493 case Decl::ClassTemplatePartialSpecialization:
4495 case Decl::UsingDirective:
4497 case Decl::StaticAssert:
4501 case Decl::TranslationUnit:
4505 case Decl::UnresolvedUsingValue:
4506 case Decl::UnresolvedUsingTypename:
4509 case Decl::UsingEnum:
4512 case Decl::ObjCPropertyImpl:
4520 llvm_unreachable(
"Unexpected Kind!");
4525 case Decl::ObjCTypeParam:
4531 case Decl::LinkageSpec:
4535 if (
const auto *TD = dyn_cast<TagDecl>(D)) {
4536 switch (TD->getTagKind()) {
4554 bool LoadExternal,
bool IncludeUndefined,
4555 bool TargetTypeIsPointer =
false) {
4558 Results.EnterNewScope();
4560 for (
const auto &M : PP.
macros(LoadExternal)) {
4562 if (IncludeUndefined || MD) {
4570 TargetTypeIsPointer)));
4574 Results.ExitScope();
4578 ResultBuilder &Results) {
4581 Results.EnterNewScope();
4585 if (LangOpts.C99 || LangOpts.CPlusPlus11)
4587 Results.ExitScope();
4594 unsigned NumResults) {
4599static CodeCompletionContext
4657 llvm_unreachable(
"Invalid ParserCompletionContext!");
4669 ResultBuilder &Results) {
4675 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
4676 if (!Method || !Method->isVirtual())
4681 for (
auto *P : Method->parameters())
4682 if (!P->getDeclName())
4688 Results.getCodeCompletionTUInfo());
4689 if (Overridden->getCanonicalDecl() == Method->getCanonicalDecl())
4695 S.
Context, CurContext, Overridden->getDeclContext());
4698 llvm::raw_string_ostream OS(Str);
4699 NNS.
print(OS, Policy);
4700 Builder.AddTextChunk(Results.getAllocator().CopyString(Str));
4702 }
else if (!InContext->
Equals(Overridden->getDeclContext()))
4705 Builder.AddTypedTextChunk(
4706 Results.getAllocator().CopyString(Overridden->getNameAsString()));
4708 bool FirstParam =
true;
4709 for (
auto *P : Method->parameters()) {
4715 Builder.AddPlaceholderChunk(
4716 Results.getAllocator().CopyString(P->getIdentifier()->getName()));
4722 Results.Ignore(Overridden);
4732 Results.EnterNewScope();
4740 SemaRef.PP.getHeaderSearchInfo().collectAllModules(Modules);
4741 for (
unsigned I = 0, N = Modules.size(); I != N; ++I) {
4742 Builder.AddTypedTextChunk(
4743 Builder.getAllocator().CopyString(Modules[I]->Name));
4744 Results.AddResult(
Result(
4757 Builder.AddTypedTextChunk(
4758 Builder.getAllocator().CopyString(Submodule->Name));
4759 Results.AddResult(
Result(
4766 Results.ExitScope();
4768 Results.getCompletionContext(), Results.data(),
4777 Results.EnterNewScope();
4782 switch (CompletionContext) {
4792 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4802 Results.setFilter(&ResultBuilder::IsOrdinaryName);
4804 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4815 auto ThisType =
SemaRef.getCurrentThisType();
4816 if (ThisType.isNull()) {
4818 if (
auto *MethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(
4819 SemaRef.getCurFunctionDecl()))
4820 Results.setExplicitObjectMemberFn(
4821 MethodDecl->isExplicitObjectMemberFunction());
4825 Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4829 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
4830 SemaRef.LookupVisibleDecls(S,
SemaRef.LookupOrdinaryName, Consumer,
4835 Results.ExitScope();
4837 switch (CompletionContext) {
4865 Results.getCompletionContext(), Results.data(),
4872 bool AtArgumentExpression,
bool IsSuper,
4873 ResultBuilder &Results);
4876 bool AllowNonIdentifiers,
4877 bool AllowNestedNameSpecifiers) {
4879 ResultBuilder Results(
4882 AllowNestedNameSpecifiers
4887 Results.EnterNewScope();
4890 Results.AddResult(
Result(
"const"));
4891 Results.AddResult(
Result(
"volatile"));
4893 Results.AddResult(
Result(
"restrict"));
4899 Results.AddResult(
"final");
4901 if (AllowNonIdentifiers) {
4902 Results.AddResult(
Result(
"operator"));
4906 if (AllowNestedNameSpecifiers) {
4907 Results.allowNestedNameSpecifiers();
4908 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4909 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
4913 Results.setFilter(
nullptr);
4916 Results.ExitScope();
4922 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4933 if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType())
4941 Results.getCompletionContext(), Results.data(),
4946 if (
Scope ==
"clang")
4954 if (
Scope ==
"_Clang")
4956 if (
Scope ==
"__gnu__")
4980 llvm::StringRef InScopeName;
4981 bool InScopeUnderscore =
false;
4983 InScopeName = InScope->
getName();
4985 InScopeName = NoUnderscore;
4986 InScopeUnderscore =
true;
4993 llvm::DenseSet<llvm::StringRef> FoundScopes;
4995 if (A.IsTargetSpecific &&
5000 for (
const auto &S : A.Spellings) {
5001 if (S.Syntax != Syntax)
5003 llvm::StringRef Name = S.NormalizedFullName;
5004 llvm::StringRef
Scope;
5007 std::tie(
Scope, Name) = Name.split(
"::");
5009 std::swap(Name,
Scope);
5015 if (!
Scope.empty() && FoundScopes.insert(
Scope).second) {
5026 if (!InScopeName.empty()) {
5027 if (
Scope != InScopeName)
5032 auto Add = [&](llvm::StringRef
Scope, llvm::StringRef Name,
5035 Results.getCodeCompletionTUInfo());
5037 if (!
Scope.empty()) {
5046 Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
Text));
5048 if (!A.ArgNames.empty()) {
5051 for (
const char *Arg : A.ArgNames) {
5055 Builder.AddPlaceholderChunk(Arg);
5060 Results.AddResult(Builder.TakeString());
5067 if (!InScopeUnderscore)
5068 Add(
Scope, Name,
false);
5073 if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
5074 if (
Scope.empty()) {
5075 Add(
Scope, Name,
true);
5080 Add(GuardedScope, Name,
true);
5090 for (
const auto &Entry : ParsedAttrInfoRegistry::entries())
5091 AddCompletions(*Entry.instantiate());
5094 Results.getCompletionContext(), Results.data(),
5113struct CoveredEnumerators {
5121 const CoveredEnumerators &Enumerators) {
5123 if (Context.getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
5130 Results.EnterNewScope();
5131 for (
auto *E :
Enum->enumerators()) {
5132 if (Enumerators.Seen.count(E))
5136 Results.AddResult(R, CurContext,
nullptr,
false);
5138 Results.ExitScope();
5144 assert(!T.isNull());
5148 if (
auto *
Specialization = T->getAs<TemplateSpecializationType>()) {
5157 if (T->isPointerType())
5158 T = T->getPointeeType();
5167 if (!Results.includeCodePatterns())
5170 Results.getCodeCompletionTUInfo());
5175 if (!Parameters.empty()) {
5184 constexpr llvm::StringLiteral NamePlaceholder =
"!#!NAME_GOES_HERE!#!";
5185 std::string
Type = std::string(NamePlaceholder);
5187 llvm::StringRef Prefix, Suffix;
5188 std::tie(Prefix, Suffix) = llvm::StringRef(
Type).split(NamePlaceholder);
5189 Prefix = Prefix.rtrim();
5190 Suffix = Suffix.ltrim();
5213 ResultBuilder Results(
5217 Data.IsParenthesized
5220 Data.PreferredType));
5223 if (
Data.ObjCCollection)
5224 Results.setFilter(&ResultBuilder::IsObjCCollection);
5225 else if (
Data.IntegralConstantExpression)
5226 Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
5228 Results.setFilter(&ResultBuilder::IsOrdinaryName);
5230 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
5232 if (!
Data.PreferredType.isNull())
5233 Results.setPreferredType(
Data.PreferredType.getNonReferenceType());
5236 for (
unsigned I = 0, N =
Data.IgnoreDecls.size(); I != N; ++I)
5237 Results.Ignore(
Data.IgnoreDecls[I]);
5239 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
5240 Consumer.setIsAddressOfOperand(IsAddressOfOperand);
5245 Results.EnterNewScope();
5247 Results.ExitScope();
5249 bool PreferredTypeIsPointer =
false;
5250 if (!
Data.PreferredType.isNull()) {
5251 PreferredTypeIsPointer =
Data.PreferredType->isAnyPointerType() ||
5252 Data.PreferredType->isMemberPointerType() ||
5253 Data.PreferredType->isBlockPointerType();
5254 if (
auto *
Enum =
Data.PreferredType->getAsEnumDecl()) {
5258 CoveredEnumerators());
5263 !
Data.IntegralConstantExpression)
5268 PreferredTypeIsPointer);
5278 Results.getCompletionContext(), Results.data(),
5284 bool IsParenthesized,
5285 bool IsAddressOfOperand) {
5288 IsAddressOfOperand);
5313 if (Protocol->hasDefinition())
5314 return Protocol->getDefinition();
5328 Builder.AddResultTypeChunk(
5330 Policy, Builder.getAllocator()));
5336 Builder.AddPlaceholderChunk(
"...");
5338 for (
unsigned I = 0, N = BlockLoc.
getNumParams(); I != N; ++I) {
5343 std::string PlaceholderStr =
5346 if (I == N - 1 && BlockProtoLoc &&
5348 PlaceholderStr +=
", ...";
5351 Builder.AddPlaceholderChunk(
5352 Builder.getAllocator().CopyString(PlaceholderStr));
5362 bool AllowNullaryMethods,
DeclContext *CurContext,
5364 bool IsBaseExprStatement =
false,
5365 bool IsClassProperty =
false,
bool InOriginalClass =
true) {
5373 if (!AddedProperties.insert(P->getIdentifier()).second)
5378 if (!P->getType().getTypePtr()->isBlockPointerType() ||
5379 !IsBaseExprStatement) {
5381 Result(P, Results.getBasePriority(P), std::nullopt);
5382 if (!InOriginalClass)
5384 Results.MaybeAddResult(R, CurContext);
5396 Result(P, Results.getBasePriority(P), std::nullopt);
5397 if (!InOriginalClass)
5399 Results.MaybeAddResult(R, CurContext);
5406 Results.getCodeCompletionTUInfo());
5409 BlockLoc, BlockProtoLoc);
5410 Result R =
Result(Builder.TakeString(), P, Results.getBasePriority(P));
5411 if (!InOriginalClass)
5413 Results.MaybeAddResult(R, CurContext);
5417 if (!P->isReadOnly()) {
5419 Results.getCodeCompletionTUInfo());
5423 Builder.AddTypedTextChunk(
5424 Results.getAllocator().CopyString(P->getName()));
5429 BlockProtoLoc,
true);
5431 Builder.AddPlaceholderChunk(
5432 Builder.getAllocator().CopyString(PlaceholderStr));
5440 Result(Builder.TakeString(), P,
5441 Results.getBasePriority(P) +
5445 if (!InOriginalClass)
5447 Results.MaybeAddResult(R, CurContext);
5451 if (IsClassProperty) {
5460 if (AllowNullaryMethods) {
5465 const IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
5468 if (!AddedProperties.insert(Name).second)
5471 Results.getCodeCompletionTUInfo());
5473 Builder.AddTypedTextChunk(
5474 Results.getAllocator().CopyString(Name->
getName()));
5477 if (!InOriginalClass)
5479 Results.MaybeAddResult(R, CurContext);
5482 if (IsClassProperty) {
5483 for (
const auto *M : Container->
methods()) {
5487 if (!M->getSelector().isUnarySelector() ||
5488 M->getReturnType()->isVoidType() || M->isInstanceMethod())
5493 for (
auto *M : Container->
methods()) {
5494 if (M->getSelector().isUnarySelector())
5502 for (
auto *P : Protocol->protocols())
5504 CurContext, AddedProperties, Results,
5505 IsBaseExprStatement, IsClassProperty,
5508 dyn_cast<ObjCInterfaceDecl>(Container)) {
5509 if (AllowCategories) {
5511 for (
auto *Cat : IFace->known_categories())
5513 CurContext, AddedProperties, Results,
5514 IsBaseExprStatement, IsClassProperty,
5519 for (
auto *I : IFace->all_referenced_protocols())
5521 CurContext, AddedProperties, Results,
5522 IsBaseExprStatement, IsClassProperty,
5526 if (IFace->getSuperClass())
5528 AllowNullaryMethods, CurContext, AddedProperties,
5529 Results, IsBaseExprStatement, IsClassProperty,
5531 }
else if (
const auto *Category =
5532 dyn_cast<ObjCCategoryDecl>(Container)) {
5534 for (
auto *P : Category->protocols())
5536 CurContext, AddedProperties, Results,
5537 IsBaseExprStatement, IsClassProperty,
5546 std::optional<FixItHint> AccessOpFixIt) {
5549 Results.setObjectTypeQualifiers(BaseType.getQualifiers(), BaseKind);
5552 Results.allowNestedNameSpecifiers();
5553 std::vector<FixItHint> FixIts;
5555 FixIts.emplace_back(*AccessOpFixIt);
5556 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
5564 if (!Results.empty()) {
5568 bool IsDependent = BaseType->isDependentType();
5570 for (
Scope *DepScope = S; DepScope; DepScope = DepScope->
getParent())
5588 BaseType = Resolver.
simplifyType(BaseType,
nullptr,
false);
5589 return dyn_cast_if_present<RecordDecl>(
5625 const IdentifierInfo *Name =
nullptr;
5630 std::optional<SmallVector<QualType, 1>> ArgTypes;
5632 enum AccessOperator {
5638 const TypeConstraint *ResultType =
nullptr;
5644 CodeCompletionString *render(Sema &S, CodeCompletionAllocator &Alloc,
5645 CodeCompletionTUInfo &Info)
const {
5646 CodeCompletionBuilder B(Alloc, Info);
5649 std::string AsString;
5651 llvm::raw_string_ostream
OS(AsString);
5652 QualType ExactType = deduceType(*ResultType);
5658 B.AddResultTypeChunk(
Alloc.CopyString(AsString));
5661 B.AddTypedTextChunk(
Alloc.CopyString(Name->
getName()));
5666 for (QualType Arg : *ArgTypes) {
5673 B.AddPlaceholderChunk(
Alloc.CopyString(
5678 return B.TakeString();
5685 ConceptInfo(
const TemplateTypeParmType &BaseType, Scope *S) {
5686 auto *TemplatedEntity = getTemplatedEntity(BaseType.getDecl(), S);
5687 for (
const AssociatedConstraint &AC :
5688 constraintsForTemplatedEntity(TemplatedEntity))
5689 believe(AC.ConstraintExpr, &BaseType);
5692 std::vector<Member> members() {
5693 std::vector<Member> Results;
5694 for (
const auto &E : this->Results)
5695 Results.push_back(E.second);
5696 llvm::sort(Results, [](
const Member &L,
const Member &R) {
5697 return L.Name->getName() <
R.Name->getName();
5704 void believe(
const Expr *E,
const TemplateTypeParmType *T) {
5707 if (
auto *CSE = dyn_cast<ConceptSpecializationExpr>(E)) {
5718 ConceptDecl *CD = CSE->getNamedConcept();
5721 for (
const auto &Arg : CSE->getTemplateArguments()) {
5722 if (Index >= Params->
size())
5724 if (isApprox(Arg, T)) {
5725 auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->
getParam(Index));
5737 }
else if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
5740 if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
5741 believe(BO->getLHS(), T);
5742 believe(BO->getRHS(), T);
5744 }
else if (
auto *RE = dyn_cast<RequiresExpr>(E)) {
5746 for (
const concepts::Requirement *Req : RE->getRequirements()) {
5747 if (!Req->isDependent())
5751 if (
auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
5753 QualType AssertedType = TR->getType()->getType();
5754 ValidVisitor(
this, T).TraverseType(AssertedType);
5755 }
else if (
auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
5756 ValidVisitor Visitor(
this, T);
5760 if (ER->getReturnTypeRequirement().isTypeConstraint()) {
5762 ER->getReturnTypeRequirement().getTypeConstraint();
5763 Visitor.OuterExpr = ER->getExpr();
5765 Visitor.TraverseStmt(ER->getExpr());
5766 }
else if (
auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
5767 believe(NR->getConstraintExpr(), T);
5777 const TemplateTypeParmType *T;
5779 CallExpr *Caller =
nullptr;
5784 Expr *OuterExpr =
nullptr;
5785 const TypeConstraint *OuterType =
nullptr;
5787 ValidVisitor(ConceptInfo *Outer,
const TemplateTypeParmType *T)
5788 : Outer(Outer), T(T) {
5794 VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E)
override {
5797 if (
Base->isPointerType() && IsArrow) {
5799 Base =
Base->getPointeeType().getTypePtr();
5801 if (isApprox(Base, T))
5802 addValue(E, E->
getMember(), IsArrow ? Member::Arrow : Member::Dot);
5807 bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E)
override {
5809 if (
Qualifier.getKind() == NestedNameSpecifier::Kind::Type &&
5816 bool VisitDependentNameType(DependentNameType *DNT)
override {
5817 NestedNameSpecifier Q = DNT->getQualifier();
5818 if (Q.
getKind() == NestedNameSpecifier::Kind::Type &&
5820 addType(DNT->getIdentifier());
5829 if (NNS.
getKind() == NestedNameSpecifier::Kind::Type) {
5831 if (NestedNameSpecifier Q = NNST->
getPrefix();
5832 Q.
getKind() == NestedNameSpecifier::Kind::Type &&
5834 if (
const auto *DNT = dyn_cast_or_null<DependentNameType>(NNST))
5835 addType(DNT->getIdentifier());
5846 bool VisitCallExpr(CallExpr *CE)
override {
5853 void addResult(
Member &&M) {
5854 auto R = Outer->Results.try_emplace(M.Name);
5859 std::make_tuple(M.ArgTypes.has_value(), M.ResultType !=
nullptr,
5860 M.Operator) > std::make_tuple(O.ArgTypes.has_value(),
5861 O.ResultType !=
nullptr,
5866 void addType(
const IdentifierInfo *Name) {
5871 M.Operator = Member::Colons;
5872 addResult(std::move(M));
5875 void addValue(Expr *E, DeclarationName Name,
5876 Member::AccessOperator Operator) {
5881 Result.Operator = Operator;
5884 if (Caller !=
nullptr && Callee == E) {
5885 Result.ArgTypes.emplace();
5886 for (
const auto *Arg : Caller->
arguments())
5887 Result.ArgTypes->push_back(Arg->getType());
5888 if (Caller == OuterExpr) {
5889 Result.ResultType = OuterType;
5893 Result.ResultType = OuterType;
5895 addResult(std::move(
Result));
5899 static bool isApprox(
const TemplateArgument &Arg,
const Type *T) {
5904 static bool isApprox(
const Type *T1,
const Type *T2) {
5913 static DeclContext *getTemplatedEntity(
const TemplateTypeParmDecl *D,
5917 Scope *Inner =
nullptr;
5920 return Inner ? Inner->
getEntity() :
nullptr;
5929 static SmallVector<AssociatedConstraint, 1>
5930 constraintsForTemplatedEntity(DeclContext *DC) {
5931 SmallVector<AssociatedConstraint, 1>
Result;
5936 TD->getAssociatedConstraints(
Result);
5938 if (
const auto *CTPSD =
5939 dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
5940 CTPSD->getAssociatedConstraints(
Result);
5941 if (
const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
5942 VTPSD->getAssociatedConstraints(
Result);
5948 static QualType deduceType(
const TypeConstraint &T) {
5954 if (Args->getNumTemplateArgs() == 1) {
5955 const auto &Arg = Args->arguments().front().getArgument();
5962 llvm::DenseMap<const IdentifierInfo *, Member> Results;
5969QualType getApproximateType(
const Expr *E, HeuristicResolver &Resolver) {
5983Expr *unwrapParenList(Expr *Base) {
5984 if (
auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(Base)) {
5985 if (PLE->getNumExprs() == 0)
5987 Base = PLE->getExpr(PLE->getNumExprs() - 1);
5996 bool IsBaseExprStatement,
QualType PreferredType) {
5998 OtherOpBase = unwrapParenList(OtherOpBase);
6003 SemaRef.PerformMemberExprBaseConversion(
Base, IsArrow);
6007 getApproximateType(ConvertedBase.
get(),
Resolver);
6013 !PointeeType.isNull()) {
6014 ConvertedBaseType = PointeeType;
6033 &ResultBuilder::IsMember);
6035 auto DoCompletion = [&](
Expr *
Base,
bool IsArrow,
6036 std::optional<FixItHint> AccessOpFixIt) ->
bool {
6041 SemaRef.PerformMemberExprBaseConversion(
Base, IsArrow);
6047 if (BaseType.isNull())
6053 !PointeeType.isNull()) {
6054 BaseType = PointeeType;
6056 }
else if (BaseType->isObjCObjectPointerType() ||
6057 BaseType->isTemplateTypeParmType()) {
6066 RD, std::move(AccessOpFixIt));
6067 }
else if (
const auto *TTPT =
6068 dyn_cast<TemplateTypeParmType>(BaseType.getTypePtr())) {
6070 IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
6071 for (
const auto &R : ConceptInfo(*TTPT, S).members()) {
6072 if (R.Operator != Operator)
6078 Result.FixIts.push_back(*AccessOpFixIt);
6079 Results.AddResult(std::move(
Result));
6081 }
else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
6085 if (AccessOpFixIt) {
6093 assert(ObjCPtr &&
"Non-NULL pointer guaranteed above!");
6096 AddedProperties, Results, IsBaseExprStatement);
6102 SemaRef.CurContext, AddedProperties, Results,
6103 IsBaseExprStatement,
false,
6105 }
else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
6106 (!IsArrow && BaseType->isObjCObjectType())) {
6110 if (AccessOpFixIt) {
6116 Class = ObjCPtr->getInterfaceDecl();
6122 CodeCompletionDeclConsumer Consumer(Results,
Class, BaseType);
6123 Results.setFilter(&ResultBuilder::IsObjCIvar);
6135 Results.EnterNewScope();
6137 bool CompletionSucceded = DoCompletion(
Base, IsArrow, std::nullopt);
6141 CompletionSucceded |= DoCompletion(
6142 OtherOpBase, !IsArrow,
6146 Results.ExitScope();
6148 if (!CompletionSucceded)
6153 Results.getCompletionContext(), Results.data(),
6159 bool IsBaseExprStatement) {
6162 SemaRef.ObjC().getObjCInterfaceDecl(ClassNamePtr, ClassNameLoc);
6169 &ResultBuilder::IsMember);
6170 Results.EnterNewScope();
6174 AddedProperties, Results, IsBaseExprStatement,
6176 Results.ExitScope();
6178 Results.getCompletionContext(), Results.data(),
6186 ResultBuilder::LookupFilter Filter =
nullptr;
6191 Filter = &ResultBuilder::IsEnum;
6196 Filter = &ResultBuilder::IsUnion;
6203 Filter = &ResultBuilder::IsClassOrStruct;
6208 llvm_unreachable(
"Unknown type specifier kind in CodeCompleteTag");
6213 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
6216 Results.setFilter(Filter);
6223 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
6230 Results.getCompletionContext(), Results.data(),
6237 Results.AddResult(
"const");
6239 Results.AddResult(
"volatile");
6241 Results.AddResult(
"restrict");
6243 Results.AddResult(
"_Atomic");
6245 Results.AddResult(
"__unaligned");
6252 Results.EnterNewScope();
6254 Results.ExitScope();
6256 Results.getCompletionContext(), Results.data(),
6265 Results.EnterNewScope();
6268 Results.AddResult(
"noexcept");
6272 Results.AddResult(
"final");
6274 Results.AddResult(
"override");
6277 Results.ExitScope();
6279 Results.getCompletionContext(), Results.data(),
6292 SemaRef.getCurFunction()->SwitchStack.back().getPointer();
6300 Data.IntegralConstantExpression =
true;
6309 CoveredEnumerators Enumerators;
6311 SC = SC->getNextSwitchCase()) {
6312 CaseStmt *Case = dyn_cast<CaseStmt>(SC);
6317 if (
auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
6319 dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
6339 Enumerators.SuggestedQualifier = DRE->getQualifier();
6354 Results.getCompletionContext(), Results.data(),
6359 if (Args.size() && !Args.data())
6362 for (
unsigned I = 0; I != Args.size(); ++I)
6383 if (Candidate.Function) {
6384 if (Candidate.Function->isDeleted())
6387 Candidate.Function) &&
6388 Candidate.Function->getNumParams() <= ArgSize &&
6397 if (Candidate.Viable)
6411 for (
auto &Candidate : Candidates) {
6412 QualType CandidateParamType = Candidate.getParamType(N);
6413 if (CandidateParamType.
isNull())
6415 if (ParamType.
isNull()) {
6416 ParamType = CandidateParamType;
6433 if (Candidates.empty())
6437 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc,
6445 Fn = unwrapParenList(Fn);
6456 auto ArgsWithoutDependentTypes =
6461 Expr *NakedFn = Fn->IgnoreParenCasts();
6467 if (
auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
6468 SemaRef.AddOverloadedCallCandidates(ULE, ArgsWithoutDependentTypes,
6471 }
else if (
auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
6473 if (UME->hasExplicitTemplateArgs()) {
6474 UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
6475 TemplateArgs = &TemplateArgsBuffer;
6480 1, UME->isImplicitAccess() ?
nullptr : UME->getBase());
6481 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6482 ArgsWithoutDependentTypes.end());
6484 Decls.
append(UME->decls_begin(), UME->decls_end());
6485 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
6486 SemaRef.AddFunctionCandidates(Decls, ArgExprs, CandidateSet, TemplateArgs,
6489 FirstArgumentIsBase);
6492 if (
auto *MCE = dyn_cast<MemberExpr>(NakedFn))
6493 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
6494 else if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
6495 FD = dyn_cast<FunctionDecl>(DRE->getDecl());
6501 SemaRef.AddOverloadCandidate(FD,
6503 ArgsWithoutDependentTypes, CandidateSet,
6513 getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
6515 SemaRef.LookupQualifiedName(R, DC);
6516 R.suppressDiagnostics();
6518 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6519 ArgsWithoutDependentTypes.end());
6520 SemaRef.AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs,
6532 if (!T->getPointeeType().isNull())
6536 if (!
SemaRef.TooManyArguments(FP->getNumParams(),
6537 ArgsWithoutDependentTypes.size(),
6573static std::optional<unsigned>
6576 static constexpr unsigned Invalid = std::numeric_limits<unsigned>::max();
6582 unsigned ArgsAfterDesignator = 0;
6583 for (
const Expr *Arg : Args) {
6584 if (
const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) {
6585 if (DIE->size() == 1 && DIE->getDesignator(0)->isFieldDesignator()) {
6586 DesignatedFieldName = DIE->getDesignator(0)->getFieldName();
6587 ArgsAfterDesignator = 0;
6594 ++ArgsAfterDesignator;
6597 if (!DesignatedFieldName)
6598 return std::nullopt;
6602 unsigned DesignatedIndex = 0;
6603 const FieldDecl *DesignatedField =
nullptr;
6604 for (
const auto *Field :
Aggregate.getAggregate()->fields()) {
6605 if (Field->getIdentifier() == DesignatedFieldName) {
6606 DesignatedField = Field;
6611 if (!DesignatedField)
6615 unsigned AggregateSize =
Aggregate.getNumParams();
6616 while (DesignatedIndex < AggregateSize &&
6617 Aggregate.getParamDecl(DesignatedIndex) != DesignatedField)
6621 return DesignatedIndex + ArgsAfterDesignator + 1;
6644 if (Braced && !RD->
isUnion() &&
6649 if (
auto NextIndex =
6652 if (*NextIndex >= AggregateSize)
6654 Results.push_back(AggregateSig);
6660 if (Args.size() < AggregateSize)
6661 Results.push_back(AggregateSig);
6671 if (
auto *FD = dyn_cast<FunctionDecl>(
C)) {
6675 SemaRef.isInitListConstructor(FD))
6682 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
C)) {
6684 SemaRef.isInitListConstructor(FTD->getTemplatedDecl()))
6687 SemaRef.AddTemplateOverloadCandidate(
6689 nullptr, Args, CandidateSet,
6710 dyn_cast<CXXConstructorDecl>(ConstructorDecl);
6715 Constructor->getParent(), SS, TemplateTypeTy, II))
6717 MemberDecl->getLocation(), ArgExprs,
6718 OpenParLoc, Braced);
6726 if (Index < Params.
size())
6729 Param = Params.
asArray().back();
6735 return llvm::isa<TemplateTypeParmDecl>(Param);
6737 return llvm::isa<NonTypeTemplateParmDecl>(Param);
6739 return llvm::isa<TemplateTemplateParmDecl>(Param);
6741 llvm_unreachable(
"Unhandled switch case");
6753 bool Matches =
true;
6754 for (
unsigned I = 0; I < Args.size(); ++I) {
6761 Results.emplace_back(TD);
6765 if (
const auto *TD =
Template.getAsTemplateDecl()) {
6767 }
else if (
const auto *OTS =
Template.getAsOverloadedTemplate()) {
6769 if (
const auto *TD = llvm::dyn_cast<TemplateDecl>(ND))
6780 if (
const auto *FD = llvm::dyn_cast<FieldDecl>(
Member))
6782 if (
const auto *IFD = llvm::dyn_cast<IndirectFieldDecl>(
Member))
6783 return IFD->getAnonField();
6794 if (BaseType.isNull())
6798 if (D.isArrayDesignator() || D.isArrayRangeDesignator()) {
6799 if (BaseType->isDependentType()) {
6800 BaseType = Context.DependentTy;
6803 const ArrayType *AT = Context.getAsArrayType(BaseType);
6810 assert(D.isFieldDesignator());
6811 if (BaseType->isDependentType()) {
6812 BaseType = Context.DependentTy;
6820 const FieldDecl *MemberDecl = LookupField(RD, D);
6833 if (BaseType.isNull())
6836 if (!RD || RD->fields().empty())
6844 Results.EnterNewScope();
6845 for (
const Decl *D : RD->decls()) {
6847 if (
auto *IFD = dyn_cast<IndirectFieldDecl>(D))
6848 FD = IFD->getAnonField();
6849 else if (
auto *DFD = dyn_cast<FieldDecl>(D))
6856 ResultBuilder::Result
Result(FD, Results.getBasePriority(FD));
6859 Results.ExitScope();
6861 Results.getCompletionContext(), Results.data(),
6873 SemaRef.LookupQualifiedName(R, RD);
6878 if (
auto *FD = dyn_cast<FieldDecl>(ND))
6880 if (
auto *IFD = dyn_cast<IndirectFieldDecl>(ND))
6881 return IFD->getAnonField();
6887 if (BaseType.isNull())
6898 &ResultBuilder::IsOffsetofField);
6900 Results.EnterNewScope();
6901 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType);
6909 Results.ExitScope();
6912 Results.getCompletionContext(), Results.data(),
6917 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(D);
6926 Data.IgnoreDecls.push_back(VD);
6936 Results.getCodeCompletionTUInfo());
6938 if (!AfterExclaim) {
6939 if (Results.includeCodePatterns()) {
6940 Builder.AddTypedTextChunk(
"constexpr");
6943 Builder.AddPlaceholderChunk(
"condition");
6948 Builder.AddPlaceholderChunk(
"statements");
6951 Results.AddResult({Builder.TakeString()});
6953 Results.AddResult({
"constexpr"});
6958 if (Results.includeCodePatterns()) {
6959 Builder.AddTypedTextChunk(
"consteval");
6963 Builder.AddPlaceholderChunk(
"statements");
6966 Results.AddResult({Builder.TakeString()});
6968 Results.AddResult({
"consteval"});
6973 Results.getCompletionContext(), Results.data(),
6981 Results.setFilter(&ResultBuilder::IsOrdinaryName);
6982 Results.EnterNewScope();
6984 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
6993 Results.getCodeCompletionTUInfo());
6995 auto AddElseBodyPattern = [&] {
7000 Builder.AddPlaceholderChunk(
"statements");
7006 Builder.AddPlaceholderChunk(
"statement");
7010 Builder.AddTypedTextChunk(
"else");
7011 if (Results.includeCodePatterns())
7012 AddElseBodyPattern();
7013 Results.AddResult(Builder.TakeString());
7016 Builder.AddTypedTextChunk(
"else if");
7020 Builder.AddPlaceholderChunk(
"condition");
7022 Builder.AddPlaceholderChunk(
"expression");
7024 if (Results.includeCodePatterns()) {
7025 AddElseBodyPattern();
7027 Results.AddResult(Builder.TakeString());
7029 Results.ExitScope();
7038 Results.getCompletionContext(), Results.data(),
7044 bool IsAddressOfOperand,
bool IsInDeclarationContext,
QualType BaseType,
7063 if (!PreferredType.
isNull())
7064 DummyResults.setPreferredType(PreferredType);
7066 CodeCompletionDeclConsumer Consumer(DummyResults, S->
getEntity(),
7073 DummyResults.getCompletionContext(),
nullptr, 0);
7080 std::optional<Sema::ContextRAII> SimulateContext;
7083 if (IsInDeclarationContext && Ctx !=
nullptr)
7084 SimulateContext.emplace(
SemaRef, Ctx);
7090 if (Ctx ==
nullptr ||
SemaRef.RequireCompleteDeclContext(SS, Ctx))
7096 if (!PreferredType.
isNull())
7097 Results.setPreferredType(PreferredType);
7098 Results.EnterNewScope();
7104 Results.AddResult(
"template");
7109 if (
const auto *TTPT = dyn_cast<TemplateTypeParmType>(NNS.
getAsType())) {
7110 for (
const auto &R : ConceptInfo(*TTPT, S).members()) {
7111 if (R.Operator != ConceptInfo::Member::Colons)
7125 if (Ctx && !EnteringContext)
7127 Results.ExitScope();
7131 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
7132 Consumer.setIsInDeclarationContext(IsInDeclarationContext);
7133 Consumer.setIsAddressOfOperand(IsAddressOfOperand);
7139 SimulateContext.reset();
7141 Results.getCompletionContext(), Results.data(),
7152 Context.setIsUsingDeclaration(
true);
7156 &ResultBuilder::IsNestedNameSpecifier);
7157 Results.EnterNewScope();
7165 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
7169 Results.ExitScope();
7172 Results.getCompletionContext(), Results.data(),
7185 &ResultBuilder::IsNamespaceOrAlias);
7186 Results.EnterNewScope();
7187 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
7191 Results.ExitScope();
7193 Results.getCompletionContext(), Results.data(),
7205 bool SuppressedGlobalResults =
7210 SuppressedGlobalResults
7213 &ResultBuilder::IsNamespace);
7215 if (Ctx && Ctx->
isFileContext() && !SuppressedGlobalResults) {
7220 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
7225 OrigToLatest[NS->getFirstDecl()] = *NS;
7229 Results.EnterNewScope();
7230 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
7231 NS = OrigToLatest.begin(),
7232 NSEnd = OrigToLatest.end();
7237 SemaRef.CurContext,
nullptr,
false);
7238 Results.ExitScope();
7242 Results.getCompletionContext(), Results.data(),
7254 &ResultBuilder::IsNamespaceOrAlias);
7255 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
7260 Results.getCompletionContext(), Results.data(),
7272 &ResultBuilder::IsType);
7273 Results.EnterNewScope();
7277#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
7278 if (OO_##Name != OO_Conditional) \
7279 Results.AddResult(Result(Spelling));
7280#include "clang/Basic/OperatorKinds.def"
7283 Results.allowNestedNameSpecifiers();
7284 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
7291 Results.ExitScope();
7294 Results.getCompletionContext(), Results.data(),
7303 SemaRef.AdjustDeclIfTemplate(ConstructorD);
7305 auto *
Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
7312 Results.EnterNewScope();
7317 for (
unsigned I = 0, E = Initializers.size(); I != E; ++I) {
7318 if (Initializers[I]->isBaseInitializer())
7320 QualType(Initializers[I]->getBaseClass(), 0)));
7322 InitializedFields.insert(
7328 bool SawLastInitializer = Initializers.empty();
7331 auto GenerateCCS = [&](
const NamedDecl *ND,
const char *Name) {
7333 Results.getCodeCompletionTUInfo());
7334 Builder.AddTypedTextChunk(Name);
7336 if (
const auto *
Function = dyn_cast<FunctionDecl>(ND))
7338 else if (
const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
7340 FunTemplDecl->getTemplatedDecl(), Builder);
7342 return Builder.TakeString();
7344 auto AddDefaultCtorInit = [&](
const char *Name,
const char *
Type,
7347 Results.getCodeCompletionTUInfo());
7348 Builder.AddTypedTextChunk(Name);
7350 Builder.AddPlaceholderChunk(
Type);
7354 Builder.TakeString(), ND,
7358 return Results.AddResult(CCR);
7361 Builder.TakeString(),
7364 auto AddCtorsWithName = [&](
const CXXRecordDecl *RD,
unsigned int Priority,
7365 const char *Name,
const FieldDecl *FD) {
7367 return AddDefaultCtorInit(Name,
7368 FD ? Results.getAllocator().CopyString(
7369 FD->getType().getAsString(Policy))
7373 if (Ctors.begin() == Ctors.end())
7374 return AddDefaultCtorInit(Name, Name, RD);
7378 Results.AddResult(CCR);
7382 const char *BaseName =
7383 Results.getAllocator().CopyString(
Base.getType().getAsString(Policy));
7384 const auto *RD =
Base.getType()->getAsCXXRecordDecl();
7389 auto AddField = [&](
const FieldDecl *FD) {
7390 const char *FieldName =
7391 Results.getAllocator().CopyString(FD->getIdentifier()->getName());
7392 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
7398 for (
const auto &
Base : ClassDecl->
bases()) {
7399 if (!InitializedBases
7402 SawLastInitializer =
7403 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7405 Base.getType(),
QualType(Initializers.back()->getBaseClass(), 0));
7410 SawLastInitializer =
false;
7414 for (
const auto &
Base : ClassDecl->
vbases()) {
7415 if (!InitializedBases
7418 SawLastInitializer =
7419 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7421 Base.getType(),
QualType(Initializers.back()->getBaseClass(), 0));
7426 SawLastInitializer =
false;
7430 for (
auto *Field : ClassDecl->
fields()) {
7431 if (!InitializedFields.insert(
cast<FieldDecl>(Field->getCanonicalDecl()))
7433 SawLastInitializer = !Initializers.empty() &&
7434 Initializers.back()->isAnyMemberInitializer() &&
7435 Initializers.back()->getAnyMember() == Field;
7439 if (!Field->getDeclName())
7443 SawLastInitializer =
false;
7445 Results.ExitScope();
7448 Results.getCompletionContext(), Results.data(),
7463 bool AfterAmpersand) {
7467 Results.EnterNewScope();
7471 bool IncludedThis =
false;
7474 IncludedThis =
true;
7483 for (
const auto *D : S->
decls()) {
7484 const auto *Var = dyn_cast<VarDecl>(D);
7485 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
7488 if (Known.insert(Var->getIdentifier()).second)
7490 SemaRef.CurContext,
nullptr,
false);
7498 Results.ExitScope();
7501 Results.getCompletionContext(), Results.data(),
7511 auto ShouldAddDefault = [&D,
this]() {
7523 auto Op = Id.OperatorFunctionId.Operator;
7526 if (Op == OverloadedOperatorKind::OO_Equal)
7529 (Op == OverloadedOperatorKind::OO_EqualEqual ||
7530 Op == OverloadedOperatorKind::OO_ExclaimEqual ||
7531 Op == OverloadedOperatorKind::OO_Less ||
7532 Op == OverloadedOperatorKind::OO_LessEqual ||
7533 Op == OverloadedOperatorKind::OO_Greater ||
7534 Op == OverloadedOperatorKind::OO_GreaterEqual ||
7535 Op == OverloadedOperatorKind::OO_Spaceship))
7541 Results.EnterNewScope();
7542 if (ShouldAddDefault())
7543 Results.AddResult(
"default");
7546 Results.AddResult(
"delete");
7547 Results.ExitScope();
7549 Results.getCompletionContext(), Results.data(),
7555#define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
7558 ResultBuilder &Results,
bool NeedAt) {
7564 Results.getCodeCompletionTUInfo());
7565 if (LangOpts.ObjC) {
7569 Builder.AddPlaceholderChunk(
"property");
7570 Results.AddResult(
Result(Builder.TakeString()));
7575 Builder.AddPlaceholderChunk(
"property");
7576 Results.AddResult(
Result(Builder.TakeString()));
7581 ResultBuilder &Results,
bool NeedAt) {
7587 if (LangOpts.ObjC) {
7602 Results.getCodeCompletionTUInfo());
7607 Builder.AddPlaceholderChunk(
"name");
7608 Results.AddResult(
Result(Builder.TakeString()));
7610 if (Results.includeCodePatterns()) {
7616 Builder.AddPlaceholderChunk(
"class");
7617 Results.AddResult(
Result(Builder.TakeString()));
7622 Builder.AddPlaceholderChunk(
"protocol");
7623 Results.AddResult(
Result(Builder.TakeString()));
7628 Builder.AddPlaceholderChunk(
"class");
7629 Results.AddResult(
Result(Builder.TakeString()));
7633 Builder.AddTypedTextChunk(
7636 Builder.AddPlaceholderChunk(
"alias");
7638 Builder.AddPlaceholderChunk(
"class");
7639 Results.AddResult(
Result(Builder.TakeString()));
7641 if (Results.getSema().getLangOpts().Modules) {
7645 Builder.AddPlaceholderChunk(
"module");
7646 Results.AddResult(
Result(Builder.TakeString()));
7654 Results.EnterNewScope();
7657 else if (
SemaRef.CurContext->isObjCContainer())
7661 Results.ExitScope();
7663 Results.getCompletionContext(), Results.data(),
7670 Results.getCodeCompletionTUInfo());
7673 const char *EncodeType =
"char[]";
7674 if (Results.getSema().getLangOpts().CPlusPlus ||
7675 Results.getSema().getLangOpts().ConstStrings)
7676 EncodeType =
"const char[]";
7677 Builder.AddResultTypeChunk(EncodeType);
7680 Builder.AddPlaceholderChunk(
"type-name");
7682 Results.AddResult(
Result(Builder.TakeString()));
7685 Builder.AddResultTypeChunk(
"Protocol *");
7688 Builder.AddPlaceholderChunk(
"protocol-name");
7690 Results.AddResult(
Result(Builder.TakeString()));
7693 Builder.AddResultTypeChunk(
"SEL");
7696 Builder.AddPlaceholderChunk(
"selector");
7698 Results.AddResult(
Result(Builder.TakeString()));
7701 Builder.AddResultTypeChunk(
"NSString *");
7703 Builder.AddPlaceholderChunk(
"string");
7704 Builder.AddTextChunk(
"\"");
7705 Results.AddResult(
Result(Builder.TakeString()));
7708 Builder.AddResultTypeChunk(
"NSArray *");
7710 Builder.AddPlaceholderChunk(
"objects, ...");
7712 Results.AddResult(
Result(Builder.TakeString()));
7715 Builder.AddResultTypeChunk(
"NSDictionary *");
7717 Builder.AddPlaceholderChunk(
"key");
7720 Builder.AddPlaceholderChunk(
"object, ...");
7722 Results.AddResult(
Result(Builder.TakeString()));
7725 Builder.AddResultTypeChunk(
"id");
7727 Builder.AddPlaceholderChunk(
"expression");
7729 Results.AddResult(
Result(Builder.TakeString()));
7735 Results.getCodeCompletionTUInfo());
7737 if (Results.includeCodePatterns()) {
7742 Builder.AddPlaceholderChunk(
"statements");
7744 Builder.AddTextChunk(
"@catch");
7746 Builder.AddPlaceholderChunk(
"parameter");
7749 Builder.AddPlaceholderChunk(
"statements");
7751 Builder.AddTextChunk(
"@finally");
7753 Builder.AddPlaceholderChunk(
"statements");
7755 Results.AddResult(
Result(Builder.TakeString()));
7761 Builder.AddPlaceholderChunk(
"expression");
7762 Results.AddResult(
Result(Builder.TakeString()));
7764 if (Results.includeCodePatterns()) {
7769 Builder.AddPlaceholderChunk(
"expression");
7772 Builder.AddPlaceholderChunk(
"statements");
7774 Results.AddResult(
Result(Builder.TakeString()));
7779 ResultBuilder &Results,
bool NeedAt) {
7792 Results.EnterNewScope();
7794 Results.ExitScope();
7796 Results.getCompletionContext(), Results.data(),
7804 Results.EnterNewScope();
7807 Results.ExitScope();
7809 Results.getCompletionContext(), Results.data(),
7817 Results.EnterNewScope();
7819 Results.ExitScope();
7821 Results.getCompletionContext(), Results.data(),
7829 if (Attributes & NewFlag)
7832 Attributes |= NewFlag;
7840 unsigned AssignCopyRetMask =
7846 if (AssignCopyRetMask &&
7868 Results.EnterNewScope();
7905 Results.getCodeCompletionTUInfo());
7914 Results.getCodeCompletionTUInfo());
7927 Results.ExitScope();
7929 Results.getCompletionContext(), Results.data(),
7943 bool AllowSameLength =
true) {
7944 unsigned NumSelIdents = SelIdents.size();
7957 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.
getNumArgs())
7960 for (
unsigned I = 0; I != NumSelIdents; ++I)
7970 bool AllowSameLength =
true) {
8004 ResultBuilder &Results,
bool InOriginalClass =
true,
8005 bool IsRootClass =
false) {
8009 IsRootClass = IsRootClass || (IFace && !IFace->
getSuperClass());
8013 if (M->isInstanceMethod() == WantInstanceMethods ||
8014 (IsRootClass && !WantInstanceMethods)) {
8020 if (!Selectors.insert(M->getSelector()).second)
8024 Result(M, Results.getBasePriority(M), std::nullopt);
8025 R.StartParameter = SelIdents.size();
8026 R.AllParametersAreInformative = (WantKind !=
MK_Any);
8027 if (!InOriginalClass)
8029 Results.MaybeAddResult(R, CurContext);
8034 if (
const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
8035 if (Protocol->hasDefinition()) {
8037 Protocol->getReferencedProtocols();
8039 E = Protocols.
end();
8041 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8042 Selectors, AllowSameLength, Results,
false, IsRootClass);
8051 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8052 Selectors, AllowSameLength, Results,
false, IsRootClass);
8056 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
8057 CurContext, Selectors, AllowSameLength, Results,
8058 InOriginalClass, IsRootClass);
8062 CatDecl->getReferencedProtocols();
8064 E = Protocols.
end();
8066 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
8067 Selectors, AllowSameLength, Results,
false, IsRootClass);
8071 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
8072 Selectors, AllowSameLength, Results, InOriginalClass,
8080 SelIdents, CurContext, Selectors, AllowSameLength, Results,
8085 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
8086 Selectors, AllowSameLength, Results, InOriginalClass,
8093 dyn_cast_or_null<ObjCInterfaceDecl>(
SemaRef.CurContext);
8096 dyn_cast_or_null<ObjCCategoryDecl>(
SemaRef.CurContext))
8097 Class = Category->getClassInterface();
8107 Results.EnterNewScope();
8113 Results.ExitScope();
8115 Results.getCompletionContext(), Results.data(),
8122 dyn_cast_or_null<ObjCInterfaceDecl>(
SemaRef.CurContext);
8125 dyn_cast_or_null<ObjCCategoryDecl>(
SemaRef.CurContext))
8126 Class = Category->getClassInterface();
8136 Results.EnterNewScope();
8143 Results.ExitScope();
8145 Results.getCompletionContext(), Results.data(),
8154 Results.EnterNewScope();
8157 bool AddedInOut =
false;
8160 Results.AddResult(
"in");
8161 Results.AddResult(
"inout");
8166 Results.AddResult(
"out");
8168 Results.AddResult(
"inout");
8173 Results.AddResult(
"bycopy");
8174 Results.AddResult(
"byref");
8175 Results.AddResult(
"oneway");
8178 Results.AddResult(
"nonnull");
8179 Results.AddResult(
"nullable");
8180 Results.AddResult(
"null_unspecified");
8188 SemaRef.PP.isMacroDefined(
"IBAction")) {
8190 Results.getCodeCompletionTUInfo(),
8192 Builder.AddTypedTextChunk(
"IBAction");
8194 Builder.AddPlaceholderChunk(
"selector");
8197 Builder.AddTextChunk(
"id");
8199 Builder.AddTextChunk(
"sender");
8210 Results.ExitScope();
8213 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
8214 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
8223 Results.getCompletionContext(), Results.data(),
8232 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(E);
8250 switch (Msg->getReceiverKind()) {
8254 IFace = ObjType->getInterface();
8258 QualType T = Msg->getInstanceReceiver()->getType();
8260 IFace = Ptr->getInterfaceDecl();
8273 if (Method->isInstanceMethod())
8274 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->
getName())
8275 .Case(
"retain", IFace)
8276 .Case(
"strong", IFace)
8277 .Case(
"autorelease", IFace)
8278 .Case(
"copy", IFace)
8279 .Case(
"copyWithZone", IFace)
8280 .Case(
"mutableCopy", IFace)
8281 .Case(
"mutableCopyWithZone", IFace)
8282 .Case(
"awakeFromCoder", IFace)
8283 .Case(
"replacementObjectFromCoder", IFace)
8284 .Case(
"class", IFace)
8285 .Case(
"classForCoder", IFace)
8286 .Case(
"superclass", Super)
8289 return llvm::StringSwitch<ObjCInterfaceDecl *>(Id->
getName())
8291 .Case(
"alloc", IFace)
8292 .Case(
"allocWithZone", IFace)
8293 .Case(
"class", IFace)
8294 .Case(
"superclass", Super)
8314static ObjCMethodDecl *
8317 ResultBuilder &Results) {
8328 while ((Class = Class->getSuperClass()) && !SuperMethod) {
8330 SuperMethod = Class->getMethod(CurMethod->
getSelector(),
8335 for (
const auto *Cat : Class->known_categories()) {
8336 if ((SuperMethod = Cat->getMethod(CurMethod->
getSelector(),
8354 CurP != CurPEnd; ++CurP, ++SuperP) {
8357 (*SuperP)->getType()))
8361 if (!(*CurP)->getIdentifier())
8367 Results.getCodeCompletionTUInfo());
8371 Results.getCompletionContext().getBaseType(), Builder);
8374 if (NeedSuperKeyword) {
8375 Builder.AddTypedTextChunk(
"super");
8381 if (NeedSuperKeyword)
8382 Builder.AddTextChunk(
8385 Builder.AddTypedTextChunk(
8389 for (
unsigned I = 0, N = Sel.
getNumArgs(); I != N; ++I, ++CurP) {
8390 if (I > SelIdents.size())
8393 if (I < SelIdents.size())
8394 Builder.AddInformativeChunk(
8396 else if (NeedSuperKeyword || I > SelIdents.size()) {
8397 Builder.AddTextChunk(
8399 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8400 (*CurP)->getIdentifier()->getName()));
8402 Builder.AddTypedTextChunk(
8404 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8405 (*CurP)->getIdentifier()->getName()));
8417 ResultBuilder Results(
8422 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
8423 : &ResultBuilder::IsObjCMessageReceiver);
8425 CodeCompletionDeclConsumer Consumer(Results,
SemaRef.CurContext);
8426 Results.EnterNewScope();
8435 if (Iface->getSuperClass()) {
8436 Results.AddResult(
Result(
"super"));
8444 Results.ExitScope();
8449 Results.getCompletionContext(), Results.data(),
8459 CDecl = CurMethod->getClassInterface();
8468 if (CurMethod->isInstanceMethod()) {
8473 AtArgumentExpression, CDecl);
8483 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
8485 }
else if (
TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
8487 getASTContext().getTypeDeclType(TD)->getAs<ObjCObjectType>())
8488 CDecl = Iface->getInterface();
8498 SemaRef.ActOnIdExpression(S, SS, TemplateKWLoc,
id,
8502 SelIdents, AtArgumentExpression);
8512 AtArgumentExpression,
8519 unsigned NumSelIdents) {
8521 ASTContext &Context = Results.getSema().Context;
8525 Result *ResultsData = Results.data();
8526 for (
unsigned I = 0, N = Results.size(); I != N; ++I) {
8527 Result &R = ResultsData[I];
8528 if (R.Kind == Result::RK_Declaration &&
8530 if (R.Priority <= BestPriority) {
8532 if (NumSelIdents <= Method->param_size()) {
8534 Method->parameters()[NumSelIdents - 1]->getType();
8535 if (R.Priority < BestPriority || PreferredType.
isNull()) {
8536 BestPriority = R.Priority;
8537 PreferredType = MyPreferredType;
8538 }
else if (!Context.hasSameUnqualifiedType(PreferredType,
8547 return PreferredType;
8553 bool AtArgumentExpression,
bool IsSuper,
8554 ResultBuilder &Results) {
8569 Results.EnterNewScope();
8576 Results.Ignore(SuperMethod);
8582 Results.setPreferredSelector(CurMethod->getSelector());
8587 Selectors, AtArgumentExpression, Results);
8605 for (SemaObjC::GlobalMethodPool::iterator
8610 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8614 Result R(MethList->getMethod(),
8615 Results.getBasePriority(MethList->getMethod()),
8617 R.StartParameter = SelIdents.size();
8618 R.AllParametersAreInformative =
false;
8619 Results.MaybeAddResult(R, SemaRef.
CurContext);
8624 Results.ExitScope();
8629 bool AtArgumentExpression,
bool IsSuper) {
8633 ResultBuilder Results(
8640 AtArgumentExpression, IsSuper, Results);
8647 if (AtArgumentExpression) {
8650 if (PreferredType.
isNull())
8658 Results.getCompletionContext(), Results.data(),
8679 RecExpr = Conv.
get();
8683 : Super ? Context.getObjCObjectPointerType(
8684 Context.getObjCInterfaceType(Super))
8685 : Context.getObjCIdType();
8695 AtArgumentExpression, Super);
8698 Context.getObjCObjectPointerType(Context.getObjCInterfaceType(IFace));
8703 RecExpr = Conv.
get();
8704 ReceiverType = RecExpr->
getType();
8709 ResultBuilder Results(
8713 ReceiverType, SelIdents));
8715 Results.EnterNewScope();
8722 Results.Ignore(SuperMethod);
8728 Results.setPreferredSelector(CurMethod->getSelector());
8741 Selectors, AtArgumentExpression, Results);
8748 for (
auto *I : QualID->quals())
8750 AtArgumentExpression, Results);
8757 SemaRef.CurContext, Selectors, AtArgumentExpression,
8761 for (
auto *I : IFacePtr->quals())
8763 AtArgumentExpression, Results);
8773 for (uint32_t I = 0,
8774 N =
SemaRef.ExternalSource->GetNumExternalSelectors();
8780 SemaRef.ObjC().ReadMethodPool(Sel);
8784 for (SemaObjC::GlobalMethodPool::iterator
8785 M =
SemaRef.ObjC().MethodPool.begin(),
8786 MEnd =
SemaRef.ObjC().MethodPool.end();
8789 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
8793 if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
8796 Result R(MethList->getMethod(),
8797 Results.getBasePriority(MethList->getMethod()),
8799 R.StartParameter = SelIdents.size();
8800 R.AllParametersAreInformative =
false;
8801 Results.MaybeAddResult(R,
SemaRef.CurContext);
8805 Results.ExitScope();
8812 if (AtArgumentExpression) {
8815 if (PreferredType.
isNull())
8823 Results.getCompletionContext(), Results.data(),
8830 Data.ObjCCollection =
true;
8836 Data.IgnoreDecls.push_back(*I);
8848 for (uint32_t I = 0, N =
SemaRef.ExternalSource->GetNumExternalSelectors();
8854 SemaRef.ObjC().ReadMethodPool(Sel);
8861 Results.EnterNewScope();
8862 for (SemaObjC::GlobalMethodPool::iterator
8863 M =
SemaRef.ObjC().MethodPool.begin(),
8864 MEnd =
SemaRef.ObjC().MethodPool.end();
8872 Results.getCodeCompletionTUInfo());
8874 Builder.AddTypedTextChunk(
8876 Results.AddResult(Builder.TakeString());
8880 std::string Accumulator;
8881 for (
unsigned I = 0, N = Sel.
getNumArgs(); I != N; ++I) {
8882 if (I == SelIdents.size()) {
8883 if (!Accumulator.empty()) {
8884 Builder.AddInformativeChunk(
8885 Builder.getAllocator().CopyString(Accumulator));
8886 Accumulator.clear();
8893 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
8894 Results.AddResult(Builder.TakeString());
8896 Results.ExitScope();
8899 Results.getCompletionContext(), Results.data(),
8906 bool OnlyForwardDeclarations,
8907 ResultBuilder &Results) {
8910 for (
const auto *D : Ctx->
decls()) {
8912 if (
const auto *Proto = dyn_cast<ObjCProtocolDecl>(D))
8913 if (!OnlyForwardDeclarations || !Proto->hasDefinition())
8914 Results.AddResult(
Result(Proto, Results.getBasePriority(Proto),
8916 CurContext,
nullptr,
false);
8927 Results.EnterNewScope();
8934 Pair.getIdentifierInfo(), Pair.getLoc()))
8935 Results.Ignore(Protocol);
8939 SemaRef.CurContext,
false, Results);
8941 Results.ExitScope();
8945 Results.getCompletionContext(), Results.data(),
8955 Results.EnterNewScope();
8959 SemaRef.CurContext,
true, Results);
8961 Results.ExitScope();
8965 Results.getCompletionContext(), Results.data(),
8972 bool OnlyForwardDeclarations,
8973 bool OnlyUnimplemented,
8974 ResultBuilder &Results) {
8977 for (
const auto *D : Ctx->
decls()) {
8979 if (
const auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
8980 if ((!OnlyForwardDeclarations || !Class->hasDefinition()) &&
8981 (!OnlyUnimplemented || !Class->getImplementation()))
8982 Results.AddResult(
Result(Class, Results.getBasePriority(Class),
8984 CurContext,
nullptr,
false);
8992 Results.EnterNewScope();
8997 SemaRef.CurContext,
false,
false, Results);
9000 Results.ExitScope();
9003 Results.getCompletionContext(), Results.data(),
9011 Results.EnterNewScope();
9016 SemaRef.CurContext,
false,
false, Results);
9019 Results.ExitScope();
9022 Results.getCompletionContext(), Results.data(),
9031 Results.EnterNewScope();
9037 Results.Ignore(CurClass);
9042 SemaRef.CurContext,
false,
false, Results);
9045 Results.ExitScope();
9048 Results.getCompletionContext(), Results.data(),
9056 Results.EnterNewScope();
9061 SemaRef.CurContext,
false,
true, Results);
9064 Results.ExitScope();
9067 Results.getCompletionContext(), Results.data(),
9085 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
9086 for (
const auto *Cat :
Class->visible_categories())
9087 CategoryNames.insert(Cat->getIdentifier());
9091 Results.EnterNewScope();
9093 for (
const auto *D : TU->
decls())
9094 if (
const auto *Category = dyn_cast<ObjCCategoryDecl>(D))
9095 if (CategoryNames.insert(Category->getIdentifier()).second)
9096 Results.AddResult(
Result(Category, Results.getBasePriority(Category),
9098 SemaRef.CurContext,
nullptr,
false);
9099 Results.ExitScope();
9102 Results.getCompletionContext(), Results.data(),
9127 Results.EnterNewScope();
9128 bool IgnoreImplemented =
true;
9130 for (
const auto *Cat :
Class->visible_categories()) {
9131 if ((!IgnoreImplemented || !Cat->getImplementation()) &&
9132 CategoryNames.insert(Cat->getIdentifier()).second)
9133 Results.AddResult(
Result(Cat, Results.getBasePriority(Cat),
9135 SemaRef.CurContext,
nullptr,
false);
9139 IgnoreImplemented =
false;
9141 Results.ExitScope();
9144 Results.getCompletionContext(), Results.data(),
9155 dyn_cast_or_null<ObjCContainerDecl>(
SemaRef.CurContext);
9162 for (
const auto *D : Container->
decls())
9163 if (
const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(D))
9164 Results.Ignore(PropertyImpl->getPropertyDecl());
9168 Results.EnterNewScope();
9170 dyn_cast<ObjCImplementationDecl>(Container))
9173 AddedProperties, Results);
9177 false,
false,
SemaRef.CurContext,
9178 AddedProperties, Results);
9179 Results.ExitScope();
9182 Results.getCompletionContext(), Results.data(),
9195 dyn_cast_or_null<ObjCContainerDecl>(
SemaRef.CurContext);
9203 dyn_cast<ObjCImplementationDecl>(Container))
9204 Class = ClassImpl->getClassInterface();
9208 ->getClassInterface();
9216 Property->getType().getNonReferenceType().getUnqualifiedType();
9219 Results.setPreferredType(PropertyType);
9224 Results.EnterNewScope();
9225 bool SawSimilarlyNamedIvar =
false;
9226 std::string NameWithPrefix;
9227 NameWithPrefix +=
'_';
9228 NameWithPrefix += PropertyName->getName();
9229 std::string NameWithSuffix = PropertyName->getName().str();
9230 NameWithSuffix +=
'_';
9233 Ivar = Ivar->getNextIvar()) {
9234 Results.AddResult(
Result(Ivar, Results.getBasePriority(Ivar),
9236 SemaRef.CurContext,
nullptr,
false);
9240 if ((PropertyName == Ivar->getIdentifier() ||
9241 NameWithPrefix == Ivar->getName() ||
9242 NameWithSuffix == Ivar->getName())) {
9243 SawSimilarlyNamedIvar =
true;
9247 if (Results.size() &&
9248 Results.data()[Results.size() - 1].Kind ==
9250 Results.data()[Results.size() - 1].Declaration == Ivar)
9251 Results.data()[Results.size() - 1].Priority--;
9256 if (!SawSimilarlyNamedIvar) {
9268 Builder.AddTypedTextChunk(Allocator.
CopyString(NameWithPrefix));
9273 Results.ExitScope();
9276 Results.getCompletionContext(), Results.data(),
9283 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
9292 std::optional<bool> WantInstanceMethods,
9295 bool InOriginalClass =
true) {
9298 if (!IFace->hasDefinition())
9301 IFace = IFace->getDefinition();
9305 IFace->getReferencedProtocols();
9307 E = Protocols.
end();
9310 KnownMethods, InOriginalClass);
9313 for (
auto *Cat : IFace->visible_categories()) {
9315 KnownMethods,
false);
9319 if (IFace->getSuperClass())
9321 WantInstanceMethods, ReturnType, KnownMethods,
9328 Category->getReferencedProtocols();
9330 E = Protocols.
end();
9333 KnownMethods, InOriginalClass);
9336 if (InOriginalClass && Category->getClassInterface())
9338 WantInstanceMethods, ReturnType, KnownMethods,
9344 if (!Protocol->hasDefinition())
9346 Protocol = Protocol->getDefinition();
9347 Container = Protocol;
9351 Protocol->getReferencedProtocols();
9353 E = Protocols.
end();
9356 KnownMethods,
false);
9362 for (
auto *M : Container->
methods()) {
9363 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
9364 if (!ReturnType.
isNull() &&
9365 !Context.hasSameUnqualifiedType(ReturnType, M->getReturnType()))
9368 KnownMethods[M->getSelector()] =
9369 KnownMethodsMap::mapped_type(M, InOriginalClass);
9383 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
9384 Builder.AddTextChunk(
9395 if (Class->getIdentifier() && Class->getIdentifier()->getName() == Name)
9404 bool IsInstanceMethod,
9407 ResultBuilder &Results) {
9409 if (!PropName || PropName->
getLength() == 0)
9427 const char *CopiedKey;
9430 : Allocator(Allocator), Key(Key), CopiedKey(
nullptr) {}
9432 operator const char *() {
9436 return CopiedKey = Allocator.
CopyString(Key);
9438 } Key(Allocator, PropName->
getName());
9441 std::string UpperKey = std::string(PropName->
getName());
9442 if (!UpperKey.empty())
9445 bool ReturnTypeMatchesProperty =
9448 Property->getType());
9449 bool ReturnTypeMatchesVoid = ReturnType.
isNull() || ReturnType->
isVoidType();
9452 if (IsInstanceMethod &&
9454 ReturnTypeMatchesProperty && !Property->getGetterMethodDecl()) {
9459 Builder.AddTypedTextChunk(Key);
9466 if (IsInstanceMethod &&
9467 ((!ReturnType.
isNull() &&
9469 (ReturnType.
isNull() && (Property->getType()->isIntegerType() ||
9470 Property->getType()->isBooleanType())))) {
9471 std::string SelectorName = (Twine(
"is") + UpperKey).str();
9475 if (ReturnType.
isNull()) {
9477 Builder.AddTextChunk(
"BOOL");
9488 if (IsInstanceMethod && ReturnTypeMatchesVoid &&
9489 !Property->getSetterMethodDecl()) {
9490 std::string SelectorName = (Twine(
"set") + UpperKey).str();
9492 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9493 if (ReturnType.
isNull()) {
9495 Builder.AddTextChunk(
"void");
9499 Builder.AddTypedTextChunk(
9503 Builder.AddTextChunk(Key);
9514 if (
const auto *ObjCPointer =
9539 if (IsInstanceMethod &&
9541 std::string SelectorName = (Twine(
"countOf") + UpperKey).str();
9545 if (ReturnType.
isNull()) {
9547 Builder.AddTextChunk(
"NSUInteger");
9553 Result(Builder.TakeString(),
9554 std::min(IndexedGetterPriority, UnorderedGetterPriority),
9561 if (IsInstanceMethod &&
9563 std::string SelectorName = (Twine(
"objectIn") + UpperKey +
"AtIndex").str();
9565 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9566 if (ReturnType.
isNull()) {
9568 Builder.AddTextChunk(
"id");
9572 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9574 Builder.AddTextChunk(
"NSUInteger");
9576 Builder.AddTextChunk(
"index");
9577 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9583 if (IsInstanceMethod &&
9590 std::string SelectorName = (Twine(Property->getName()) +
"AtIndexes").str();
9592 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9593 if (ReturnType.
isNull()) {
9595 Builder.AddTextChunk(
"NSArray *");
9599 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9601 Builder.AddTextChunk(
"NSIndexSet *");
9603 Builder.AddTextChunk(
"indexes");
9604 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9610 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9611 std::string SelectorName = (Twine(
"get") + UpperKey).str();
9612 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9613 &Context.Idents.get(
"range")};
9615 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9616 if (ReturnType.
isNull()) {
9618 Builder.AddTextChunk(
"void");
9622 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9624 Builder.AddPlaceholderChunk(
"object-type");
9625 Builder.AddTextChunk(
" **");
9627 Builder.AddTextChunk(
"buffer");
9629 Builder.AddTypedTextChunk(
"range:");
9631 Builder.AddTextChunk(
"NSRange");
9633 Builder.AddTextChunk(
"inRange");
9634 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9642 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9643 std::string SelectorName = (Twine(
"in") + UpperKey +
"AtIndex").str();
9644 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(
"insertObject"),
9645 &Context.Idents.get(SelectorName)};
9647 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9648 if (ReturnType.
isNull()) {
9650 Builder.AddTextChunk(
"void");
9654 Builder.AddTypedTextChunk(
"insertObject:");
9656 Builder.AddPlaceholderChunk(
"object-type");
9657 Builder.AddTextChunk(
" *");
9659 Builder.AddTextChunk(
"object");
9661 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9663 Builder.AddPlaceholderChunk(
"NSUInteger");
9665 Builder.AddTextChunk(
"index");
9666 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9672 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9673 std::string SelectorName = (Twine(
"insert") + UpperKey).str();
9674 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9675 &Context.Idents.get(
"atIndexes")};
9677 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9678 if (ReturnType.
isNull()) {
9680 Builder.AddTextChunk(
"void");
9684 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9686 Builder.AddTextChunk(
"NSArray *");
9688 Builder.AddTextChunk(
"array");
9690 Builder.AddTypedTextChunk(
"atIndexes:");
9692 Builder.AddPlaceholderChunk(
"NSIndexSet *");
9694 Builder.AddTextChunk(
"indexes");
9695 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9701 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9702 std::string SelectorName =
9703 (Twine(
"removeObjectFrom") + UpperKey +
"AtIndex").str();
9704 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9705 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9706 if (ReturnType.
isNull()) {
9708 Builder.AddTextChunk(
"void");
9712 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9714 Builder.AddTextChunk(
"NSUInteger");
9716 Builder.AddTextChunk(
"index");
9717 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9723 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9724 std::string SelectorName = (Twine(
"remove") + UpperKey +
"AtIndexes").str();
9725 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9726 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9727 if (ReturnType.
isNull()) {
9729 Builder.AddTextChunk(
"void");
9733 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9735 Builder.AddTextChunk(
"NSIndexSet *");
9737 Builder.AddTextChunk(
"indexes");
9738 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9744 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9745 std::string SelectorName =
9746 (Twine(
"replaceObjectIn") + UpperKey +
"AtIndex").str();
9747 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName),
9748 &Context.Idents.get(
"withObject")};
9750 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9751 if (ReturnType.
isNull()) {
9753 Builder.AddTextChunk(
"void");
9757 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9759 Builder.AddPlaceholderChunk(
"NSUInteger");
9761 Builder.AddTextChunk(
"index");
9763 Builder.AddTypedTextChunk(
"withObject:");
9765 Builder.AddTextChunk(
"id");
9767 Builder.AddTextChunk(
"object");
9768 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9774 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9775 std::string SelectorName1 =
9776 (Twine(
"replace") + UpperKey +
"AtIndexes").str();
9777 std::string SelectorName2 = (Twine(
"with") + UpperKey).str();
9778 const IdentifierInfo *SelectorIds[2] = {&Context.Idents.get(SelectorName1),
9779 &Context.Idents.get(SelectorName2)};
9781 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9782 if (ReturnType.
isNull()) {
9784 Builder.AddTextChunk(
"void");
9788 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName1 +
":"));
9790 Builder.AddPlaceholderChunk(
"NSIndexSet *");
9792 Builder.AddTextChunk(
"indexes");
9794 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName2 +
":"));
9796 Builder.AddTextChunk(
"NSArray *");
9798 Builder.AddTextChunk(
"array");
9799 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9806 if (IsInstanceMethod &&
9812 ->
getName() ==
"NSEnumerator"))) {
9813 std::string SelectorName = (Twine(
"enumeratorOf") + UpperKey).str();
9814 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9817 if (ReturnType.
isNull()) {
9819 Builder.AddTextChunk(
"NSEnumerator *");
9823 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName));
9824 Results.AddResult(
Result(Builder.TakeString(), UnorderedGetterPriority,
9830 if (IsInstanceMethod &&
9832 std::string SelectorName = (Twine(
"memberOf") + UpperKey).str();
9833 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9834 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9835 if (ReturnType.
isNull()) {
9837 Builder.AddPlaceholderChunk(
"object-type");
9838 Builder.AddTextChunk(
" *");
9842 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9844 if (ReturnType.
isNull()) {
9845 Builder.AddPlaceholderChunk(
"object-type");
9846 Builder.AddTextChunk(
" *");
9849 ReturnType, Context, Policy, Builder.getAllocator()));
9852 Builder.AddTextChunk(
"object");
9853 Results.AddResult(
Result(Builder.TakeString(), UnorderedGetterPriority,
9860 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9861 std::string SelectorName =
9862 (Twine(
"add") + UpperKey + Twine(
"Object")).str();
9863 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9864 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9865 if (ReturnType.
isNull()) {
9867 Builder.AddTextChunk(
"void");
9871 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9873 Builder.AddPlaceholderChunk(
"object-type");
9874 Builder.AddTextChunk(
" *");
9876 Builder.AddTextChunk(
"object");
9877 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9883 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9884 std::string SelectorName = (Twine(
"add") + UpperKey).str();
9885 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9886 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9887 if (ReturnType.
isNull()) {
9889 Builder.AddTextChunk(
"void");
9893 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9895 Builder.AddTextChunk(
"NSSet *");
9897 Builder.AddTextChunk(
"objects");
9898 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9904 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9905 std::string SelectorName =
9906 (Twine(
"remove") + UpperKey + Twine(
"Object")).str();
9907 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9908 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9909 if (ReturnType.
isNull()) {
9911 Builder.AddTextChunk(
"void");
9915 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9917 Builder.AddPlaceholderChunk(
"object-type");
9918 Builder.AddTextChunk(
" *");
9920 Builder.AddTextChunk(
"object");
9921 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9927 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9928 std::string SelectorName = (Twine(
"remove") + UpperKey).str();
9929 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9930 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9931 if (ReturnType.
isNull()) {
9933 Builder.AddTextChunk(
"void");
9937 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9939 Builder.AddTextChunk(
"NSSet *");
9941 Builder.AddTextChunk(
"objects");
9942 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9948 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9949 std::string SelectorName = (Twine(
"intersect") + UpperKey).str();
9950 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9951 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9952 if (ReturnType.
isNull()) {
9954 Builder.AddTextChunk(
"void");
9958 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName +
":"));
9960 Builder.AddTextChunk(
"NSSet *");
9962 Builder.AddTextChunk(
"objects");
9963 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9970 if (!IsInstanceMethod &&
9977 std::string SelectorName =
9978 (Twine(
"keyPathsForValuesAffecting") + UpperKey).str();
9979 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
9982 if (ReturnType.
isNull()) {
9984 Builder.AddTextChunk(
"NSSet<NSString *> *");
9988 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName));
9995 if (!IsInstanceMethod &&
9998 std::string SelectorName =
9999 (Twine(
"automaticallyNotifiesObserversOf") + UpperKey).str();
10000 const IdentifierInfo *SelectorId = &Context.Idents.get(SelectorName);
10003 if (ReturnType.
isNull()) {
10005 Builder.AddTextChunk(
"BOOL");
10009 Builder.AddTypedTextChunk(Allocator.
CopyString(SelectorName));
10017 Scope *S, std::optional<bool> IsInstanceMethod,
ParsedType ReturnTy) {
10022 Decl *IDecl =
nullptr;
10023 if (
SemaRef.CurContext->isObjCContainer()) {
10029 bool IsInImplementation =
false;
10030 if (
Decl *D = IDecl) {
10032 SearchDecl = Impl->getClassInterface();
10033 IsInImplementation =
true;
10035 dyn_cast<ObjCCategoryImplDecl>(D)) {
10036 SearchDecl = CatImpl->getCategoryDecl();
10037 IsInImplementation =
true;
10039 SearchDecl = dyn_cast<ObjCContainerDecl>(D);
10042 if (!SearchDecl && S) {
10044 SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
10063 Results.EnterNewScope();
10065 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
10066 MEnd = KnownMethods.end();
10070 Results.getCodeCompletionTUInfo());
10073 if (!IsInstanceMethod) {
10074 Builder.AddTextChunk(
Method->isInstanceMethod() ?
"-" :
"+");
10080 if (ReturnType.
isNull()) {
10081 QualType ResTy =
Method->getSendResultType().stripObjCKindOfType(Context);
10082 AttributedType::stripOuterNullability(ResTy);
10091 Builder.AddTypedTextChunk(
10097 PEnd =
Method->param_end();
10098 P != PEnd; (
void)++P, ++I) {
10101 Builder.AddTypedTextChunk(
10102 Builder.getAllocator().CopyString(Sel.
getNameForSlot(I) +
":"));
10105 Builder.AddTypedTextChunk(
10106 Builder.getAllocator().CopyString(Sel.
getNameForSlot(I) +
":"));
10113 ParamType = (*P)->getType();
10115 ParamType = (*P)->getOriginalType();
10118 AttributedType::stripOuterNullability(ParamType);
10120 Context, Policy, Builder);
10123 Builder.AddTextChunk(
10124 Builder.getAllocator().CopyString(Id->getName()));
10128 if (
Method->isVariadic()) {
10129 if (
Method->param_size() > 0)
10131 Builder.AddTextChunk(
"...");
10134 if (IsInImplementation && Results.includeCodePatterns()) {
10139 if (!
Method->getReturnType()->isVoidType()) {
10141 Builder.AddTextChunk(
"return");
10143 Builder.AddPlaceholderChunk(
"expression");
10146 Builder.AddPlaceholderChunk(
"statements");
10153 auto R =
Result(Builder.TakeString(),
Method, Priority);
10154 if (!M->second.getInt())
10156 Results.AddResult(std::move(R));
10161 if (Context.getLangOpts().ObjC) {
10163 Containers.push_back(SearchDecl);
10166 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
10167 MEnd = KnownMethods.end();
10169 KnownSelectors.insert(M->first);
10174 IFace = Category->getClassInterface();
10179 if (IsInstanceMethod) {
10180 for (
unsigned I = 0, N = Containers.size(); I != N; ++I)
10181 for (
auto *P : Containers[I]->instance_properties())
10183 KnownSelectors, Results);
10187 Results.ExitScope();
10190 Results.getCompletionContext(), Results.data(),
10195 Scope *S,
bool IsInstanceMethod,
bool AtParameterName,
ParsedType ReturnTy,
10199 if (
SemaRef.ExternalSource) {
10200 for (uint32_t I = 0, N =
SemaRef.ExternalSource->GetNumExternalSelectors();
10206 SemaRef.ObjC().ReadMethodPool(Sel);
10217 Results.setPreferredType(
10218 SemaRef.GetTypeFromParser(ReturnTy).getNonReferenceType());
10220 Results.EnterNewScope();
10221 for (SemaObjC::GlobalMethodPool::iterator
10222 M =
SemaRef.ObjC().MethodPool.begin(),
10223 MEnd =
SemaRef.ObjC().MethodPool.end();
10225 for (
ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
10226 : &M->second.second;
10227 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
10231 if (AtParameterName) {
10233 unsigned NumSelIdents = SelIdents.size();
10234 if (NumSelIdents &&
10235 NumSelIdents <= MethList->getMethod()->param_size()) {
10237 MethList->getMethod()->parameters()[NumSelIdents - 1];
10238 if (Param->getIdentifier()) {
10240 Results.getCodeCompletionTUInfo());
10241 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
10242 Param->getIdentifier()->getName()));
10243 Results.AddResult(Builder.TakeString());
10250 Result R(MethList->getMethod(),
10251 Results.getBasePriority(MethList->getMethod()),
10253 R.StartParameter = SelIdents.size();
10254 R.AllParametersAreInformative =
false;
10255 R.DeclaringEntity =
true;
10256 Results.MaybeAddResult(R,
SemaRef.CurContext);
10260 Results.ExitScope();
10262 if (!AtParameterName && !SelIdents.empty() &&
10263 SelIdents.front()->getName().starts_with(
"init")) {
10264 for (
const auto &M :
SemaRef.PP.macros()) {
10265 if (M.first->getName() !=
"NS_DESIGNATED_INITIALIZER")
10267 Results.EnterNewScope();
10269 Results.getCodeCompletionTUInfo());
10270 Builder.AddTypedTextChunk(
10271 Builder.getAllocator().CopyString(M.first->getName()));
10274 Results.ExitScope();
10279 Results.getCompletionContext(), Results.data(),
10287 Results.EnterNewScope();
10291 Results.getCodeCompletionTUInfo());
10292 Builder.AddTypedTextChunk(
"if");
10294 Builder.AddPlaceholderChunk(
"condition");
10295 Results.AddResult(Builder.TakeString());
10298 Builder.AddTypedTextChunk(
"ifdef");
10300 Builder.AddPlaceholderChunk(
"macro");
10301 Results.AddResult(Builder.TakeString());
10304 Builder.AddTypedTextChunk(
"ifndef");
10306 Builder.AddPlaceholderChunk(
"macro");
10307 Results.AddResult(Builder.TakeString());
10309 if (InConditional) {
10311 Builder.AddTypedTextChunk(
"elif");
10313 Builder.AddPlaceholderChunk(
"condition");
10314 Results.AddResult(Builder.TakeString());
10317 Builder.AddTypedTextChunk(
"elifdef");
10319 Builder.AddPlaceholderChunk(
"macro");
10320 Results.AddResult(Builder.TakeString());
10323 Builder.AddTypedTextChunk(
"elifndef");
10325 Builder.AddPlaceholderChunk(
"macro");
10326 Results.AddResult(Builder.TakeString());
10329 Builder.AddTypedTextChunk(
"else");
10330 Results.AddResult(Builder.TakeString());
10333 Builder.AddTypedTextChunk(
"endif");
10334 Results.AddResult(Builder.TakeString());
10338 Builder.AddTypedTextChunk(
"include");
10340 Builder.AddTextChunk(
"\"");
10341 Builder.AddPlaceholderChunk(
"header");
10342 Builder.AddTextChunk(
"\"");
10343 Results.AddResult(Builder.TakeString());
10346 Builder.AddTypedTextChunk(
"include");
10348 Builder.AddTextChunk(
"<");
10349 Builder.AddPlaceholderChunk(
"header");
10350 Builder.AddTextChunk(
">");
10351 Results.AddResult(Builder.TakeString());
10354 Builder.AddTypedTextChunk(
"define");
10356 Builder.AddPlaceholderChunk(
"macro");
10357 Results.AddResult(Builder.TakeString());
10360 Builder.AddTypedTextChunk(
"define");
10362 Builder.AddPlaceholderChunk(
"macro");
10364 Builder.AddPlaceholderChunk(
"args");
10366 Results.AddResult(Builder.TakeString());
10369 Builder.AddTypedTextChunk(
"undef");
10371 Builder.AddPlaceholderChunk(
"macro");
10372 Results.AddResult(Builder.TakeString());
10375 Builder.AddTypedTextChunk(
"line");
10377 Builder.AddPlaceholderChunk(
"number");
10378 Results.AddResult(Builder.TakeString());
10381 Builder.AddTypedTextChunk(
"line");
10383 Builder.AddPlaceholderChunk(
"number");
10385 Builder.AddTextChunk(
"\"");
10386 Builder.AddPlaceholderChunk(
"filename");
10387 Builder.AddTextChunk(
"\"");
10388 Results.AddResult(Builder.TakeString());
10391 Builder.AddTypedTextChunk(
"error");
10393 Builder.AddPlaceholderChunk(
"message");
10394 Results.AddResult(Builder.TakeString());
10397 Builder.AddTypedTextChunk(
"pragma");
10399 Builder.AddPlaceholderChunk(
"arguments");
10400 Results.AddResult(Builder.TakeString());
10404 Builder.AddTypedTextChunk(
"import");
10406 Builder.AddTextChunk(
"\"");
10407 Builder.AddPlaceholderChunk(
"header");
10408 Builder.AddTextChunk(
"\"");
10409 Results.AddResult(Builder.TakeString());
10412 Builder.AddTypedTextChunk(
"import");
10414 Builder.AddTextChunk(
"<");
10415 Builder.AddPlaceholderChunk(
"header");
10416 Builder.AddTextChunk(
">");
10417 Results.AddResult(Builder.TakeString());
10421 Builder.AddTypedTextChunk(
"include_next");
10423 Builder.AddTextChunk(
"\"");
10424 Builder.AddPlaceholderChunk(
"header");
10425 Builder.AddTextChunk(
"\"");
10426 Results.AddResult(Builder.TakeString());
10429 Builder.AddTypedTextChunk(
"include_next");
10431 Builder.AddTextChunk(
"<");
10432 Builder.AddPlaceholderChunk(
"header");
10433 Builder.AddTextChunk(
">");
10434 Results.AddResult(Builder.TakeString());
10437 Builder.AddTypedTextChunk(
"warning");
10439 Builder.AddPlaceholderChunk(
"message");
10440 Results.AddResult(Builder.TakeString());
10444 Builder.AddTypedTextChunk(
"embed");
10446 Builder.AddTextChunk(
"\"");
10447 Builder.AddPlaceholderChunk(
"file");
10448 Builder.AddTextChunk(
"\"");
10449 Results.AddResult(Builder.TakeString());
10452 Builder.AddTypedTextChunk(
"embed");
10454 Builder.AddTextChunk(
"<");
10455 Builder.AddPlaceholderChunk(
"file");
10456 Builder.AddTextChunk(
">");
10457 Results.AddResult(Builder.TakeString());
10465 Results.ExitScope();
10468 Results.getCompletionContext(), Results.data(),
10487 Results.getCodeCompletionTUInfo());
10488 Results.EnterNewScope();
10489 for (
const auto &M :
SemaRef.PP.macros()) {
10490 Builder.AddTypedTextChunk(
10491 Builder.getAllocator().CopyString(M.first->getName()));
10495 Results.ExitScope();
10496 }
else if (IsDefinition) {
10501 Results.getCompletionContext(), Results.data(),
10514 Results.EnterNewScope();
10516 Results.getCodeCompletionTUInfo());
10517 Builder.AddTypedTextChunk(
"defined");
10520 Builder.AddPlaceholderChunk(
"macro");
10522 Results.AddResult(Builder.TakeString());
10523 Results.ExitScope();
10526 Results.getCompletionContext(), Results.data(),
10546 std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
10549 llvm::sys::path::native(NativeRelDir);
10550 llvm::vfs::FileSystem &FS =
10551 SemaRef.getSourceManager().getFileManager().getVirtualFileSystem();
10556 llvm::DenseSet<StringRef> SeenResults;
10559 auto AddCompletion = [&](StringRef Filename,
bool IsDirectory) {
10562 TypedChunk.push_back(IsDirectory ?
'/' : Angled ?
'>' :
'"');
10563 auto R = SeenResults.insert(TypedChunk);
10565 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
10566 *R.first = InternedTyped;
10569 Builder.AddTypedTextChunk(InternedTyped);
10577 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
10581 if (!NativeRelDir.empty()) {
10585 auto Begin = llvm::sys::path::begin(NativeRelDir);
10586 auto End = llvm::sys::path::end(NativeRelDir);
10588 llvm::sys::path::append(Dir, *Begin +
".framework",
"Headers");
10589 llvm::sys::path::append(Dir, ++Begin, End);
10591 llvm::sys::path::append(Dir, NativeRelDir);
10595 const StringRef &Dirname = llvm::sys::path::filename(Dir);
10596 const bool isQt = Dirname.starts_with(
"Qt") || Dirname ==
"ActiveQt";
10597 const bool ExtensionlessHeaders =
10598 IsSystem || isQt || Dir.ends_with(
".framework/Headers") ||
10599 IncludeDir.ends_with(
"/include") || IncludeDir.ends_with(
"\\include");
10600 std::error_code EC;
10601 unsigned Count = 0;
10602 for (
auto It = FS.dir_begin(Dir, EC);
10603 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
10604 if (++Count == 2500)
10606 StringRef Filename = llvm::sys::path::filename(It->path());
10611 llvm::sys::fs::file_type
Type = It->type();
10612 if (
Type == llvm::sys::fs::file_type::symlink_file) {
10613 if (
auto FileStatus = FS.status(It->path()))
10614 Type = FileStatus->getType();
10617 case llvm::sys::fs::file_type::directory_file:
10621 NativeRelDir.empty() && !Filename.consume_back(
".framework"))
10624 AddCompletion(Filename,
true);
10626 case llvm::sys::fs::file_type::regular_file: {
10628 const bool IsHeader = Filename.ends_with_insensitive(
".h") ||
10629 Filename.ends_with_insensitive(
".hh") ||
10630 Filename.ends_with_insensitive(
".hpp") ||
10631 Filename.ends_with_insensitive(
".hxx") ||
10632 Filename.ends_with_insensitive(
".inc") ||
10633 (ExtensionlessHeaders && !Filename.contains(
'.'));
10636 AddCompletion(Filename,
false);
10648 switch (IncludeDir.getLookupType()) {
10653 AddFilesFromIncludeDir(IncludeDir.getDirRef()->getName(), IsSystem,
10657 AddFilesFromIncludeDir(IncludeDir.getFrameworkDirRef()->getName(),
10666 const auto &S =
SemaRef.PP.getHeaderSearchInfo();
10667 using llvm::make_range;
10670 if (
auto CurFile =
SemaRef.PP.getCurrentFileLexer()->getFileEntry())
10671 AddFilesFromIncludeDir(CurFile->getDir().getName(),
false,
10673 for (
const auto &D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
10674 AddFilesFromDirLookup(D,
false);
10676 for (
const auto &D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
10677 AddFilesFromDirLookup(D,
false);
10678 for (
const auto &D : make_range(S.system_dir_begin(), S.system_dir_end()))
10679 AddFilesFromDirLookup(D,
true);
10682 Results.getCompletionContext(), Results.data(),
10696 Results.EnterNewScope();
10697 static const char *Platforms[] = {
"macOS",
"iOS",
"watchOS",
"tvOS"};
10701 Twine(Platform) +
"ApplicationExtension")));
10703 Results.ExitScope();
10705 Results.getCompletionContext(), Results.data(),
10712 ResultBuilder Builder(
SemaRef, Allocator, CCTUInfo,
10715 CodeCompletionDeclConsumer Consumer(
10727 Results.insert(Results.end(), Builder.data(),
10728 Builder.data() + Builder.size());
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.
Result
Implement __builtin_bit_cast and related operations.
llvm::MachO::Record Record
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)
Determines whether the accessed entity is accessible.
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.
pointer(const DeclIndexPair &Value)
const DeclIndexPair * operator->() const
pointer operator->() const
reference operator*() const
std::ptrdiff_t difference_type
friend bool operator!=(const iterator &X, const iterator &Y)
iterator(const NamedDecl *SingleDecl, unsigned Index)
std::input_iterator_tag iterator_category
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 ...
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>.
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.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Syntax
The style used to specify an attribute.
Type source information for an attributed type.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Wrapper for source info for block pointers.
This class is used for builtin types like 'int'.
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
QualType getBaseType() const
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Represents a static or instance method of a struct/union/class.
overridden_method_range overridden_methods() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
Qualifiers getMethodQualifiers() const
Represents a C++ struct/union/class.
bool isAggregate() const
Determine whether this class is an aggregate (C++ [dcl.init.aggr]), which is a class with no user-dec...
CXXRecordDecl * getDefinition() const
base_class_range vbases()
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
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.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
CaseStmt - Represent a case statement.
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.
const TemplateDecl * getTemplate() const
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.
@ CCC_ObjCClassForwardDecl
QualType getBaseType() const
Retrieve the type of the base object in a member-access expression.
void setPreferredType(QualType T)
bool wantConstructorResults() const
Determines whether we want C++ constructors as results within this context.
void setIsUsingDeclaration(bool V)
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_Macro
Refers to a macro.
@ 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_SemiColon
A semicolon (';').
@ 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_LeftBrace
A left brace ('{').
@ CK_LeftAngle
A left angle bracket ('<').
Expr * getConstraintExpr() const
const TypeClass * getTypePtr() const
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isRequiresExprBody() const
bool isFileContext() const
DeclContextLookupResult lookup_result
ASTContext & getParentASTContext() const
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
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
decl_iterator decls_end() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
decl_iterator decls_begin() const
Captures information about "declaration specifiers".
static const TST TST_typename
TST getTypeSpecType() const
static const TST TST_interface
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
static const TST TST_union
TSC getTypeSpecComplex() const
ParsedType getRepAsType() const
static const TST TST_enum
static const TST TST_class
unsigned getParsedSpecifiers() const
Return a bitmask of which flavors of specifiers this DeclSpec includes.
bool isTypeAltiVecVector() const
TypeSpecifierSign getTypeSpecSign() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
@ FOK_Undeclared
A friend of a previously-undeclared entity.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
unsigned getIdentifierNamespace() const
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Member
Members, declared with object declarations within tag definitions.
@ IDNS_ObjCProtocol
Objective C @protocol.
@ IDNS_Namespace
Namespaces, declared with 'namespace foo {}'.
@ IDNS_LocalExtern
This declaration is a function-local extern declaration of a variable or function.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
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...
@ CXXConversionFunctionName
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.
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
DeclaratorContext getContext() const
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool isStaticMember()
Returns true if this declares a static member.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
Designation - Represent a full designation, which is a sequence of designators.
const Designator & getDesignator(unsigned Idx) const
unsigned getNumDesignators() const
Designator - A designator in a C99 designated initializer.
const IdentifierInfo * getFieldDecl() const
DirectoryLookup - This class represents one entry in the search list that specifies the search order ...
virtual bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isTypeDependent() const
Determines whether the type of this expression depends on.
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.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
ArrayRef< ParmVarDecl * > parameters() const
bool isVariadic() const
Whether this function is variadic.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Represents a prototype with parameter type info, e.g.
ExceptionSpecInfo getExceptionSpecInfo() const
Return all the available information about this type's exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
Declaration of a template function.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
TypeLoc getReturnLoc() const
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
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
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.
Represents the results of name lookup.
Encapsulates the data about a macro definition (e.g.
bool isC99Varargs() const
bool isFunctionLike() const
param_iterator param_begin() const
IdentifierInfo *const * param_iterator
Parameters - The list of parameters for a function-like macro.
param_iterator param_end() const
bool isUsedForHeaderGuard() const
Determine whether this macro was used for a header guard.
Describes a module or submodule.
@ AllVisible
All of the names in this module are visible.
ModuleKind Kind
The kind of this module.
llvm::iterator_range< submodule_iterator > submodules()
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
@ ModulePartitionInterface
This is a C++20 module partition interface.
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
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...
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
Represent a C++ namespace.
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.
const Type * getAsType() const
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCContainerDecl - Represents a container for method declarations.
method_range methods() const
instprop_range instance_properties() const
classprop_range class_properties() const
Captures information about "declaration specifiers" specific to Objective-C.
ObjCPropertyAttribute::Kind getPropertyAttributes() const
ObjCDeclQualifier getObjCDeclQualifier() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
bool hasDefinition() const
Determine whether this class has been defined.
protocol_range protocols() const
known_categories_range known_categories() const
ObjCImplementationDecl * getImplementation() const
visible_categories_range visible_categories() const
ObjCInterfaceDecl * getSuperClass() const
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCList - This is a simple template class used to hold various lists of decls etc,...
@ SuperInstance
The receiver is the instance of the superclass object.
@ Instance
The receiver is an object instance.
@ SuperClass
The receiver is a superclass.
@ Class
The receiver is a class.
ObjCMethodDecl - Represents an instance or class method declaration.
unsigned param_size() const
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
Selector getSelector() const
bool isInstanceMethod() const
ParmVarDecl *const * param_iterator
ObjCInterfaceDecl * getClassInterface()
Represents a pointer to an Objective C object.
ObjCInterfaceDecl * getInterfaceDecl() const
If this pointer points to an Objective @interface type, gets the declaration for that interface.
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)
Lookup a property by name in the specified DeclContext.
Selector getGetterName() const
Represents an Objective-C protocol declaration.
void * getAsOpaquePtr() const
static OpaquePtr make(QualType P)
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_CodeCompletion
When doing overload resolution during code completion, we want to show all viable candidates,...
CandidateSetKind getKind() const
Represents a parameter to a function.
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.
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.
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.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
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...
QualType substObjCTypeArgs(ASTContext &ctx, ArrayRef< QualType > typeArgs, ObjCSubstitutionContext context) const
Substitute type arguments for the Objective-C type parameters used in the subject type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Wrapper of type source information for a type with non-trivial direct qualifiers.
The collection of all-type qualifiers we support.
bool hasOnlyConst() const
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
bool hasOnlyVolatile() const
bool hasOnlyRestrict() const
Represents a struct/union/class.
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
field_range fields() const
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
Scope * getContinueParent()
getContinueParent - Return the closest scope that a continue statement would be affected by.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
Scope * getBreakParent()
getBreakParent - Return the closest scope that a break statement would be affected by.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
bool isClassInheritanceScope() const
Determines whether this scope is between inheritance colon and the real class/struct definition.
@ FunctionPrototypeScope
This is a scope that corresponds to the parameters within a function prototype.
@ AtCatchScope
This is a scope that corresponds to the Objective-C @catch statement.
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
@ ClassScope
The scope of a struct/union/class definition.
@ DeclScope
This is a scope that can contain a declaration.
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
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
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 CodeCompleteUsing(Scope *S)
void CodeCompleteObjCMessageReceiver(Scope *S)
void CodeCompleteOperatorName(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 CodeCompleteCase(Scope *S)
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 CodeCompletePreprocessorExpression()
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
HeuristicResolver Resolver
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 CodeCompleteNaturalLanguage()
void CodeCompleteObjCClassPropertyRefExpr(Scope *S, const IdentifierInfo &ClassName, SourceLocation ClassNameLoc, bool IsBaseExprStatement)
void CodeCompleteInitializer(Scope *S, Decl *D)
void CodeCompleteObjCProtocolReferences(ArrayRef< IdentifierLoc > Protocols)
void CodeCompleteNamespaceDecl(Scope *S)
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 CodeCompleteAvailabilityPlatformName()
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".
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.
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....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
@ LookupAnyName
Look up any declaration with any name.
Preprocessor & getPreprocessor() const
ASTContext & getASTContext() const
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
const LangOptions & getLangOpts() const
void LookupVisibleDecls(Scope *S, LookupNameKind Kind, VisibleDeclConsumer &Consumer, bool IncludeGlobalScope=true, bool LoadExternal=true)
SemaCodeCompletion & CodeCompletion()
sema::FunctionScopeInfo * getCurFunction() const
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
ExternalSemaSource * getExternalSource() const
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
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
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.
Represents the declaration of a struct/union/class/enum.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
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.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const
TemplateDecl * getNamedConcept() const
Represents a declaration of a type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
QualType getType() const
Get the type for which this source info wrapper provides information.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isBooleanType() const
const ObjCObjectPointerType * getAsObjCQualifiedIdType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
const ObjCObjectPointerType * getAsObjCInterfacePointerType() const
NestedNameSpecifier getPrefix() const
If this type represents a qualified-id, this returns its nested name specifier.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isObjCObjectOrInterfaceType() const
bool isMemberPointerType() const
bool isObjCIdType() const
bool isObjCObjectType() const
bool isObjCObjectPointerType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
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...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Wrapper for source info for typedefs.
Represents a C++ unqualified-id that has been parsed.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
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 ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a C++11 virt-specifier-seq.
bool isOverrideSpecified() const
bool isFinalSpecified() const
Consumes visible declarations found when searching for all visible names within a given scope or cont...
Retains information about a block that is currently being parsed.
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
SmallVector< SwitchInfo, 8 > SwitchStack
SwitchStack - This is the current set of active switch statements in the block.
@ CXCursor_ObjCInterfaceDecl
An Objective-C @interface.
@ CXCursor_Namespace
A C++ namespace.
@ CXCursor_TypedefDecl
A typedef.
@ CXCursor_CXXAccessSpecifier
An access specifier.
@ CXCursor_EnumConstantDecl
An enumerator constant.
@ CXCursor_ConversionFunction
A C++ conversion function.
@ CXCursor_ConceptDecl
a concept declaration.
@ CXCursor_ClassTemplate
A C++ class template.
@ CXCursor_UnionDecl
A C or C++ union.
@ CXCursor_ObjCSynthesizeDecl
An Objective-C @synthesize definition.
@ CXCursor_ParmDecl
A function or method parameter.
@ CXCursor_FieldDecl
A field (in C) or non-static data member (in C++) in a struct, union, or C++ class.
@ CXCursor_CXXMethod
A C++ class method.
@ CXCursor_EnumDecl
An enumeration.
@ CXCursor_ObjCClassMethodDecl
An Objective-C class method.
@ CXCursor_TranslationUnit
Cursor that represents the translation unit itself.
@ CXCursor_ClassTemplatePartialSpecialization
A C++ class template partial specialization.
@ CXCursor_ObjCProtocolDecl
An Objective-C @protocol declaration.
@ CXCursor_FunctionTemplate
A C++ function template.
@ CXCursor_ObjCImplementationDecl
An Objective-C @implementation.
@ CXCursor_NonTypeTemplateParameter
A C++ non-type template parameter.
@ CXCursor_FunctionDecl
A function.
@ CXCursor_ObjCPropertyDecl
An Objective-C @property declaration.
@ CXCursor_Destructor
A C++ destructor.
@ CXCursor_ObjCIvarDecl
An Objective-C instance variable.
@ CXCursor_TypeAliasTemplateDecl
@ CXCursor_ObjCCategoryImplDecl
An Objective-C @implementation for a category.
@ CXCursor_ObjCDynamicDecl
An Objective-C @dynamic definition.
@ CXCursor_MacroDefinition
@ CXCursor_VarDecl
A variable.
@ CXCursor_TemplateTypeParameter
A C++ template type parameter.
@ CXCursor_TemplateTemplateParameter
A C++ template template parameter.
@ CXCursor_UnexposedDecl
A declaration whose specific kind is not exposed via this interface.
@ CXCursor_ObjCInstanceMethodDecl
An Objective-C instance method.
@ CXCursor_StructDecl
A C or C++ struct.
@ CXCursor_UsingDeclaration
A C++ using declaration.
@ CXCursor_LinkageSpec
A linkage specification, e.g.
@ CXCursor_ClassDecl
A C++ class.
@ CXCursor_ObjCCategoryDecl
An Objective-C @interface for a category.
@ CXCursor_StaticAssert
A static_assert or _Static_assert node.
@ CXCursor_ModuleImportDecl
A module import declaration.
@ CXCursor_MemberRef
A reference to a member of a struct, union, or class that occurs in some non-expression context,...
@ CXCursor_NamespaceAlias
A C++ namespace alias declaration.
@ CXCursor_Constructor
A C++ constructor.
@ CXCursor_FriendDecl
a friend declaration.
@ CXCursor_TypeAliasDecl
A C++ alias declaration.
@ CXCursor_UsingDirective
A C++ using directive.
@ CXAvailability_Available
The entity is available.
@ CXAvailability_Deprecated
The entity is available, but has been deprecated (and its use is not recommended).
@ CXAvailability_NotAvailable
The entity is not available; any use of it will be an error.
@ 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)
bool Add(InterpState &S, CodePtr OpPC)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
bool isa(CodeGen::Address addr)
@ 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...
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.
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ NonNull
Values of this type can never be null.
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.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
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.
@ 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.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Property
The type of a property.
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
SimplifiedTypeClass
A simplified classification of types used when determining "similar" types for code completion.
@ Template
We are parsing a template declaration.
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.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY char toUppercase(char c)
Converts the given ASCII character to its uppercase equivalent.
@ NonType
The name was classified as a specific non-type, non-template declaration.
@ Type
The name was classified as a type.
@ OverloadSet
The name was classified as an overload set, and an expression representing that overload set has been...
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.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
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)
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
U cast(CodeGen::Address addr)
@ Enumerator
Enumerator value with fixed underlying type.
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.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ StartsWithDoubleUnderscore
ActionResult< Expr * > ExprResult
@ 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...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
bool IntegralConstantExpression
SmallVector< Decl *, 4 > IgnoreDecls
CodeCompleteExpressionData(QualType PreferredType=QualType(), bool IsParenthesized=false)
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
Represents a complete lambda introducer.
SmallVector< LambdaCapture, 4 > Captures
LambdaCaptureDefault Default
a linked list of methods with the same selector name but different signatures.
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
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 CleanUglifiedParameters
Whether to strip underscores when printing reserved parameter names.
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 AnonymousTagNameStyle