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;
83 std::vector<Result> Results;
90 typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
95 class ShadowMapEntry {
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;
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));
135 cast<DeclIndexPairVector *>(DeclOrVector)
136 ->push_back(DeclIndexPair(ND, Index));
140 if (DeclIndexPairVector *Vec =
141 dyn_cast_if_present<DeclIndexPairVector *>(DeclOrVector)) {
149 iterator begin()
const;
150 iterator end()
const;
156 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
173 bool AllowNestedNameSpecifiers;
184 std::list<ShadowMap> ShadowMaps;
198 bool HasObjectTypeQualifiers;
201 bool IsExplicitObjectMemberFunction;
213 void AdjustResultPriorityForDecl(Result &R);
215 void MaybeAddConstructorResults(Result R);
221 LookupFilter Filter =
nullptr)
222 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
224 HasObjectTypeQualifiers(
false), IsExplicitObjectMemberFunction(
false),
225 CompletionContext(CompletionContext), ObjCImplementation(nullptr) {
228 switch (CompletionContext.
getKind()) {
236 if (
Method->isInstanceMethod())
238 ObjCImplementation =
Interface->getImplementation();
251 bool includeCodePatterns()
const {
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(); }
276 ObjectTypeQualifiers = Quals;
278 HasObjectTypeQualifiers =
true;
281 void setExplicitObjectMemberFn(
bool IsExplicitObjectFn) {
282 IsExplicitObjectMemberFunction = IsExplicitObjectFn;
290 void setPreferredSelector(
Selector Sel) { PreferredSelector = Sel; }
295 return CompletionContext;
299 void allowNestedNameSpecifiers(
bool Allow =
true) {
300 AllowNestedNameSpecifiers =
Allow;
305 Sema &getSema()
const {
return SemaRef; }
319 bool isInterestingDecl(
const NamedDecl *ND,
320 bool &AsNestedNameSpecifier)
const;
345 bool CheckHiddenResult(Result &R,
DeclContext *CurContext,
355 void MaybeAddResult(Result R,
DeclContext *CurContext =
nullptr);
372 bool InBaseClass,
QualType BaseExprType);
375 void AddResult(Result R);
378 void EnterNewScope();
397 bool IsOrdinaryName(
const NamedDecl *ND)
const;
398 bool IsOrdinaryNonTypeName(
const NamedDecl *ND)
const;
399 bool IsIntegralConstantValue(
const NamedDecl *ND)
const;
400 bool IsOrdinaryNonValueName(
const NamedDecl *ND)
const;
401 bool IsNestedNameSpecifier(
const NamedDecl *ND)
const;
403 bool IsClassOrStruct(
const NamedDecl *ND)
const;
405 bool IsNamespace(
const NamedDecl *ND)
const;
406 bool IsNamespaceOrAlias(
const NamedDecl *ND)
const;
408 bool IsMember(
const NamedDecl *ND)
const;
409 bool IsObjCIvar(
const NamedDecl *ND)
const;
410 bool IsObjCMessageReceiver(
const NamedDecl *ND)
const;
411 bool IsObjCMessageReceiverOrLambdaCapture(
const NamedDecl *ND)
const;
412 bool IsObjCCollection(
const NamedDecl *ND)
const;
413 bool IsImpossibleToSatisfy(
const NamedDecl *ND)
const;
423 ComputeType =
nullptr;
424 Type = BSI->ReturnType;
428 ComputeType =
nullptr;
432 ComputeType =
nullptr;
441 auto *VD = llvm::dyn_cast_or_null<ValueDecl>(
D);
442 ComputeType =
nullptr;
455 ComputeType =
nullptr;
465 this->ComputeType = ComputeType;
475 if (ExpectedLoc == LParLoc)
486 if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
489 if (Op == tok::minus)
502 case tok::minusequal:
504 case tok::percentequal:
506 case tok::slashequal:
512 case tok::equalequal:
513 case tok::exclaimequal:
517 case tok::greaterequal:
521 case tok::greatergreater:
522 case tok::greatergreaterequal:
524 case tok::lesslessequal:
537 case tok::caretequal:
545 case tok::periodstar:
573 case tok::minusminus:
583 assert(
false &&
"unhandled unary op");
592 ComputeType =
nullptr;
599 if (!Enabled || !
Base)
602 if (ExpectedLoc !=
Base->getBeginLoc())
613 ComputeType =
nullptr;
622 ComputeType =
nullptr;
631 ComputeType =
nullptr;
639 ComputeType =
nullptr;
645 llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
646 unsigned SingleDeclIndex;
666 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
669 : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
672 if (isa<const NamedDecl *>(DeclOrIterator)) {
678 const DeclIndexPair *I = cast<const DeclIndexPair *>(DeclOrIterator);
691 if (
const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrIterator))
694 return *cast<const DeclIndexPair *>(DeclOrIterator);
700 return X.DeclOrIterator.getOpaqueValue() ==
701 Y.DeclOrIterator.getOpaqueValue() &&
702 X.SingleDeclIndex == Y.SingleDeclIndex;
711ResultBuilder::ShadowMapEntry::begin()
const {
712 if (DeclOrVector.isNull())
715 if (
const NamedDecl *ND = dyn_cast<const NamedDecl *>(DeclOrVector))
716 return iterator(ND, SingleDeclIndex);
718 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->begin());
722ResultBuilder::ShadowMapEntry::end()
const {
723 if (isa<const NamedDecl *>(DeclOrVector) || DeclOrVector.isNull())
726 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->end());
747 for (
const DeclContext *CommonAncestor = TargetContext;
748 CommonAncestor && !CommonAncestor->
Encloses(CurContext);
749 CommonAncestor = CommonAncestor->getLookupParent()) {
750 if (CommonAncestor->isTransparentContext() ||
751 CommonAncestor->isFunctionOrMethod())
754 TargetParents.push_back(CommonAncestor);
758 while (!TargetParents.empty()) {
761 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(
Parent)) {
762 if (!Namespace->getIdentifier())
766 }
else if (
const auto *TD = dyn_cast<TagDecl>(
Parent)) {
799bool ResultBuilder::isInterestingDecl(
const NamedDecl *ND,
800 bool &AsNestedNameSpecifier)
const {
801 AsNestedNameSpecifier =
false;
816 if (isa<ClassTemplateSpecializationDecl>(ND) ||
817 isa<ClassTemplatePartialSpecializationDecl>(ND))
821 if (isa<UsingDecl>(ND))
827 if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
828 (isa<NamespaceDecl>(ND) && Filter != &ResultBuilder::IsNamespace &&
829 Filter != &ResultBuilder::IsNamespaceOrAlias && Filter !=
nullptr))
830 AsNestedNameSpecifier =
true;
833 if (Filter && !(this->*Filter)(Named)) {
835 if (AllowNestedNameSpecifiers && SemaRef.
getLangOpts().CPlusPlus &&
836 IsNestedNameSpecifier(ND) &&
837 (Filter != &ResultBuilder::IsMember ||
838 (isa<CXXRecordDecl>(ND) &&
839 cast<CXXRecordDecl>(ND)->isInjectedClassName()))) {
840 AsNestedNameSpecifier =
true;
870 R.QualifierIsInformative =
false;
874 R.Declaration->getDeclContext());
883 switch (cast<BuiltinType>(
T)->
getKind()) {
884 case BuiltinType::Void:
887 case BuiltinType::NullPtr:
890 case BuiltinType::Overload:
891 case BuiltinType::Dependent:
894 case BuiltinType::ObjCId:
895 case BuiltinType::ObjCClass:
896 case BuiltinType::ObjCSel:
909 case Type::BlockPointer:
912 case Type::LValueReference:
913 case Type::RValueReference:
916 case Type::ConstantArray:
917 case Type::IncompleteArray:
918 case Type::VariableArray:
919 case Type::DependentSizedArray:
922 case Type::DependentSizedExtVector:
924 case Type::ExtVector:
927 case Type::FunctionProto:
928 case Type::FunctionNoProto:
937 case Type::ObjCObject:
938 case Type::ObjCInterface:
939 case Type::ObjCObjectPointer:
953 if (
const auto *
Type = dyn_cast<TypeDecl>(ND))
955 if (
const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
956 return C.getObjCInterfaceType(Iface);
961 else if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(ND))
962 T =
Method->getSendResultType();
963 else if (
const auto *
Enumerator = dyn_cast<EnumConstantDecl>(ND))
967 else if (
const auto *
Property = dyn_cast<ObjCPropertyDecl>(ND))
969 else if (
const auto *
Value = dyn_cast<ValueDecl>(ND))
985 if (
Pointer->getPointeeType()->isFunctionType()) {
994 T =
Block->getPointeeType();
1009unsigned ResultBuilder::getBasePriority(
const NamedDecl *ND) {
1017 if (
const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
1018 if (ImplicitParam->getIdentifier() &&
1019 ImplicitParam->getIdentifier()->isStr(
"_cmd"))
1026 if (DC->
isRecord() || isa<ObjCContainerDecl>(DC)) {
1028 if (isa<CXXDestructorDecl>(ND))
1040 if (isa<EnumConstantDecl>(ND))
1046 if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) &&
1048 CompletionContext.
getKind() ==
1050 CompletionContext.
getKind() ==
1057void ResultBuilder::AdjustResultPriorityForDecl(
Result &R) {
1060 if (!PreferredSelector.
isNull())
1061 if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(R.Declaration))
1062 if (PreferredSelector ==
Method->getSelector())
1067 if (!PreferredType.
isNull()) {
1077 !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
1088 return Record->lookup(ConstructorName);
1091void ResultBuilder::MaybeAddConstructorResults(
Result R) {
1092 if (!SemaRef.
getLangOpts().CPlusPlus || !R.Declaration ||
1099 Record = ClassTemplate->getTemplatedDecl();
1100 else if ((
Record = dyn_cast<CXXRecordDecl>(
D))) {
1102 if (isa<ClassTemplateSpecializationDecl>(
Record))
1114 R.Declaration = Ctor;
1116 Results.push_back(R);
1121 if (
const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
1122 ND = Tmpl->getTemplatedDecl();
1123 return isa<CXXConstructorDecl>(ND);
1127 assert(!ShadowMaps.empty() &&
"Must enter into a results scope");
1129 if (R.Kind != Result::RK_Declaration) {
1131 Results.push_back(R);
1136 if (
const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1138 getBasePriority(
Using->getTargetDecl()),
1142 std::move(R.FixIts));
1144 MaybeAddResult(
Result, CurContext);
1151 bool AsNestedNameSpecifier =
false;
1152 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1159 ShadowMap &
SMap = ShadowMaps.back();
1160 ShadowMapEntry::iterator I, IEnd;
1161 ShadowMap::iterator NamePos =
SMap.find(R.Declaration->getDeclName());
1162 if (NamePos !=
SMap.end()) {
1163 I = NamePos->second.begin();
1164 IEnd = NamePos->second.end();
1167 for (; I != IEnd; ++I) {
1169 unsigned Index = I->second;
1172 Results[Index].Declaration = R.Declaration;
1182 std::list<ShadowMap>::iterator
SM, SMEnd = ShadowMaps.end();
1184 for (
SM = ShadowMaps.begin();
SM != SMEnd; ++
SM) {
1185 ShadowMapEntry::iterator I, IEnd;
1186 ShadowMap::iterator NamePos =
SM->find(R.Declaration->getDeclName());
1187 if (NamePos !=
SM->end()) {
1188 I = NamePos->second.begin();
1189 IEnd = NamePos->second.end();
1191 for (; I != IEnd; ++I) {
1193 if (I->first->hasTagIdentifierNamespace() &&
1201 I->first->getIdentifierNamespace() != IDNS)
1205 if (CheckHiddenResult(R, CurContext, I->first))
1213 if (!AllDeclsFound.insert(CanonDecl).second)
1218 if (AsNestedNameSpecifier) {
1219 R.StartsNestedNameSpecifier =
true;
1222 AdjustResultPriorityForDecl(R);
1225 if (R.QualifierIsInformative && !R.Qualifier &&
1226 !R.StartsNestedNameSpecifier) {
1227 const DeclContext *Ctx = R.Declaration->getDeclContext();
1228 if (
const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1231 else if (
const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
1235 std::nullopt, Tag,
false)
1238 R.QualifierIsInformative =
false;
1243 SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size());
1244 Results.push_back(R);
1246 if (!AsNestedNameSpecifier)
1247 MaybeAddConstructorResults(R);
1267 return OverloadCompare::BothViable;
1272 return OverloadCompare::BothViable;
1274 if (Candidate.
parameters()[I]->getType().getCanonicalType() !=
1275 Incumbent.
parameters()[I]->getType().getCanonicalType())
1276 return OverloadCompare::BothViable;
1279 return OverloadCompare::BothViable;
1284 if (CandidateRef != IncumbentRef) {
1291 return CandidateRef ==
RQ_RValue ? OverloadCompare::Dominates
1292 : OverloadCompare::Dominated;
1300 if (CandidateSuperset == IncumbentSuperset)
1301 return OverloadCompare::BothViable;
1302 return IncumbentSuperset ? OverloadCompare::Dominates
1303 : OverloadCompare::Dominated;
1312 const auto *CurrentClassScope = [&]() ->
const CXXRecordDecl * {
1313 for (
DeclContext *Ctx = CurContext; Ctx; Ctx = Ctx->getParent()) {
1314 const auto *CtxMethod = llvm::dyn_cast<CXXMethodDecl>(Ctx);
1315 if (CtxMethod && !CtxMethod->getParent()->isLambda()) {
1316 return CtxMethod->getParent();
1323 bool FunctionCanBeCall =
1324 CurrentClassScope &&
1325 (CurrentClassScope ==
Method->getParent() ||
1326 CurrentClassScope->isDerivedFrom(
Method->getParent()));
1329 if (FunctionCanBeCall)
1334 BaseExprType.
isNull() ?
nullptr
1336 auto *MaybeBase =
Method->getParent();
1338 MaybeDerived == MaybeBase || MaybeDerived->isDerivedFrom(MaybeBase);
1341 return FunctionCanBeCall;
1344bool ResultBuilder::canFunctionBeCalled(
const NamedDecl *ND,
1355 if (
const auto *FuncTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
1356 ND = FuncTmpl->getTemplatedDecl();
1358 const auto *
Method = dyn_cast<CXXMethodDecl>(ND);
1360 return canCxxMethodBeCalled(
Method, BaseExprType);
1367 NamedDecl *Hiding,
bool InBaseClass =
false,
1369 if (R.Kind != Result::RK_Declaration) {
1371 Results.push_back(R);
1376 if (
const auto *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1378 getBasePriority(
Using->getTargetDecl()),
1382 std::move(R.FixIts));
1384 AddResult(
Result, CurContext, Hiding,
false,
1389 bool AsNestedNameSpecifier =
false;
1390 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1397 if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
1401 if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl()).second)
1406 if (AsNestedNameSpecifier) {
1407 R.StartsNestedNameSpecifier =
true;
1409 }
else if (Filter == &ResultBuilder::IsMember && !R.Qualifier &&
1412 R.Declaration->getDeclContext()->getRedeclContext()))
1413 R.QualifierIsInformative =
true;
1416 if (R.QualifierIsInformative && !R.Qualifier &&
1417 !R.StartsNestedNameSpecifier) {
1418 const DeclContext *Ctx = R.Declaration->getDeclContext();
1419 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1422 else if (
const auto *Tag = dyn_cast<TagDecl>(Ctx))
1426 std::nullopt, Tag,
false)
1429 R.QualifierIsInformative =
false;
1436 AdjustResultPriorityForDecl(R);
1439 const auto GetQualifiers = [&](
const CXXMethodDecl *MethodDecl) {
1440 if (MethodDecl->isExplicitObjectMemberFunction())
1441 return MethodDecl->getFunctionObjectParameterType().getQualifiers();
1443 return MethodDecl->getMethodQualifiers();
1446 if (IsExplicitObjectMemberFunction &&
1448 (isa<CXXMethodDecl>(R.Declaration) || isa<FieldDecl>(R.Declaration))) {
1455 if (HasObjectTypeQualifiers)
1456 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(R.Declaration))
1457 if (
Method->isInstance()) {
1459 if (ObjectTypeQualifiers == MethodQuals)
1461 else if (ObjectTypeQualifiers - MethodQuals) {
1467 switch (
Method->getRefQualifier()) {
1484 CurContext,
Method->getDeclName().getAsOpaqueInteger())];
1486 Result &Incumbent = Results[Entry.second];
1488 *cast<CXXMethodDecl>(Incumbent.Declaration),
1489 ObjectTypeQualifiers, ObjectKind,
1491 case OverloadCompare::Dominates:
1495 Incumbent = std::move(R);
1497 case OverloadCompare::Dominated:
1500 case OverloadCompare::BothViable:
1507 R.FunctionCanBeCall = canFunctionBeCalled(R.getDeclaration(), BaseExprType);
1510 Results.push_back(R);
1512 if (!AsNestedNameSpecifier)
1513 MaybeAddConstructorResults(R);
1516void ResultBuilder::AddResult(
Result R) {
1517 assert(R.Kind != Result::RK_Declaration &&
1518 "Declaration results need more context");
1519 Results.push_back(R);
1523void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
1526void ResultBuilder::ExitScope() {
1527 ShadowMaps.pop_back();
1532bool ResultBuilder::IsOrdinaryName(
const NamedDecl *ND)
const {
1541 if (isa<ObjCIvarDecl>(ND))
1550bool ResultBuilder::IsOrdinaryNonTypeName(
const NamedDecl *ND)
const {
1552 if (isa<TypeDecl>(ND))
1557 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
1558 if (!
ID->getDefinition())
1566 if (isa<ObjCIvarDecl>(ND))
1573bool ResultBuilder::IsIntegralConstantValue(
const NamedDecl *ND)
const {
1574 if (!IsOrdinaryNonTypeName(ND))
1578 if (VD->getType()->isIntegralOrEnumerationType())
1586bool ResultBuilder::IsOrdinaryNonValueName(
const NamedDecl *ND)
const {
1594 !isa<FunctionTemplateDecl>(ND) && !isa<ObjCPropertyDecl>(ND);
1599bool ResultBuilder::IsNestedNameSpecifier(
const NamedDecl *ND)
const {
1601 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1602 ND = ClassTemplate->getTemplatedDecl();
1608bool ResultBuilder::IsEnum(
const NamedDecl *ND)
const {
1609 return isa<EnumDecl>(ND);
1613bool ResultBuilder::IsClassOrStruct(
const NamedDecl *ND)
const {
1615 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1616 ND = ClassTemplate->getTemplatedDecl();
1619 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1628bool ResultBuilder::IsUnion(
const NamedDecl *ND)
const {
1630 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1631 ND = ClassTemplate->getTemplatedDecl();
1633 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1640bool ResultBuilder::IsNamespace(
const NamedDecl *ND)
const {
1641 return isa<NamespaceDecl>(ND);
1646bool ResultBuilder::IsNamespaceOrAlias(
const NamedDecl *ND)
const {
1651bool ResultBuilder::IsType(
const NamedDecl *ND)
const {
1653 return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
1659bool ResultBuilder::IsMember(
const NamedDecl *ND)
const {
1661 return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
1662 isa<ObjCPropertyDecl>(ND);
1666 T =
C.getCanonicalType(
T);
1668 case Type::ObjCObject:
1669 case Type::ObjCInterface:
1670 case Type::ObjCObjectPointer:
1674 switch (cast<BuiltinType>(
T)->
getKind()) {
1675 case BuiltinType::ObjCId:
1676 case BuiltinType::ObjCClass:
1677 case BuiltinType::ObjCSel:
1689 if (!
C.getLangOpts().CPlusPlus)
1698bool ResultBuilder::IsObjCMessageReceiver(
const NamedDecl *ND)
const {
1708bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
1710 if (IsObjCMessageReceiver(ND))
1713 const auto *Var = dyn_cast<VarDecl>(ND);
1717 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
1720bool ResultBuilder::IsObjCCollection(
const NamedDecl *ND)
const {
1721 if ((SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
1722 (!SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1736bool ResultBuilder::IsImpossibleToSatisfy(
const NamedDecl *ND)
const {
1742bool ResultBuilder::IsObjCIvar(
const NamedDecl *ND)
const {
1743 return isa<ObjCIvarDecl>(ND);
1751 ResultBuilder &Results;
1757 std::vector<FixItHint> FixIts;
1760 CodeCompletionDeclConsumer(
1761 ResultBuilder &Results,
DeclContext *InitialLookupCtx,
1763 std::vector<FixItHint> FixIts = std::vector<FixItHint>())
1764 : Results(Results), InitialLookupCtx(InitialLookupCtx),
1765 FixIts(
std::move(FixIts)) {
1766 NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
1769 auto ThisType = Results.getSema().getCurrentThisType();
1770 if (!ThisType.isNull()) {
1771 assert(ThisType->isPointerType());
1777 this->BaseType = BaseType;
1781 bool InBaseClass)
override {
1786 Results.AddResult(Result, InitialLookupCtx, Hiding, InBaseClass, BaseType);
1790 Results.addVisitedContext(Ctx);
1799 auto *NamingClass = this->NamingClass;
1800 QualType BaseType = this->BaseType;
1801 if (
auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
1816 NamingClass =
nullptr;
1819 return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
1826 ResultBuilder &Results) {
1853 Results.getCodeCompletionTUInfo());
1854 if (LangOpts.CPlusPlus) {
1862 Builder.AddTypedTextChunk(
"typename");
1864 Builder.AddPlaceholderChunk(
"name");
1865 Results.AddResult(
Result(Builder.TakeString()));
1867 if (LangOpts.CPlusPlus11) {
1872 Builder.AddTypedTextChunk(
"decltype");
1874 Builder.AddPlaceholderChunk(
"expression");
1876 Results.AddResult(
Result(Builder.TakeString()));
1879 if (LangOpts.Char8 || LangOpts.CPlusPlus20)
1885 if (LangOpts.GNUKeywords) {
1891 Builder.AddTypedTextChunk(
"typeof");
1893 Builder.AddPlaceholderChunk(
"expression");
1894 Results.AddResult(
Result(Builder.TakeString()));
1896 Builder.AddTypedTextChunk(
"typeof");
1898 Builder.AddPlaceholderChunk(
"type");
1900 Results.AddResult(
Result(Builder.TakeString()));
1911 const LangOptions &LangOpts, ResultBuilder &Results) {
1916 Results.AddResult(
Result(
"extern"));
1917 Results.AddResult(
Result(
"static"));
1919 if (LangOpts.CPlusPlus11) {
1924 Builder.AddTypedTextChunk(
"alignas");
1926 Builder.AddPlaceholderChunk(
"expression");
1928 Results.AddResult(
Result(Builder.TakeString()));
1930 Results.AddResult(
Result(
"constexpr"));
1931 Results.AddResult(
Result(
"thread_local"));
1934 if (LangOpts.CPlusPlus20)
1935 Results.AddResult(
Result(
"constinit"));
1940 const LangOptions &LangOpts, ResultBuilder &Results) {
1945 if (LangOpts.CPlusPlus) {
1946 Results.AddResult(
Result(
"explicit"));
1947 Results.AddResult(
Result(
"friend"));
1948 Results.AddResult(
Result(
"mutable"));
1949 Results.AddResult(
Result(
"virtual"));
1957 if (LangOpts.CPlusPlus || LangOpts.C99)
1958 Results.AddResult(
Result(
"inline"));
1960 if (LangOpts.CPlusPlus20)
1961 Results.AddResult(
Result(
"consteval"));
1981 ResultBuilder &Results,
bool NeedAt);
1983 ResultBuilder &Results,
bool NeedAt);
1985 ResultBuilder &Results,
bool NeedAt);
1990 Results.getCodeCompletionTUInfo());
1991 Builder.AddTypedTextChunk(
"typedef");
1993 Builder.AddPlaceholderChunk(
"type");
1995 Builder.AddPlaceholderChunk(
"name");
2002 ResultBuilder &Results) {
2003 Builder.AddTypedTextChunk(
"using");
2005 Builder.AddPlaceholderChunk(
"name");
2007 Builder.AddPlaceholderChunk(
"type");
2030 return LangOpts.CPlusPlus;
2037 return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
2040 llvm_unreachable(
"Invalid ParserCompletionContext!");
2066 if (!
T.getLocalQualifiers()) {
2069 return BT->getNameAsCString(Policy);
2072 if (
const TagType *TagT = dyn_cast<TagType>(
T))
2073 if (
TagDecl *Tag = TagT->getOriginalDecl())
2074 if (!Tag->hasNameForLinkage()) {
2075 switch (Tag->getTagKind()) {
2077 return "struct <anonymous>";
2079 return "__interface <anonymous>";
2081 return "class <anonymous>";
2083 return "union <anonymous>";
2085 return "enum <anonymous>";
2092 T.getAsStringInternal(
Result, Policy);
2093 return Allocator.CopyString(
Result);
2105 Builder.AddResultTypeChunk(
2107 Builder.AddTypedTextChunk(
"this");
2112 ResultBuilder &Results,
2114 if (!LangOpts.CPlusPlus11)
2117 Builder.AddTypedTextChunk(
"static_assert");
2119 Builder.AddPlaceholderChunk(
"expression");
2121 Builder.AddPlaceholderChunk(
"message");
2130 Sema &S = Results.getSema();
2131 const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.
CurContext);
2137 llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
2138 for (
auto *
Method : CR->methods()) {
2144 for (
const auto &
Base : CR->bases()) {
2145 const auto *BR =
Base.getType().getTypePtr()->getAsCXXRecordDecl();
2148 for (
auto *
Method : BR->methods()) {
2151 const auto it = Overrides.find(
Method->getName());
2152 bool IsOverriden =
false;
2153 if (it != Overrides.end()) {
2154 for (
auto *MD : it->second) {
2172 false, CCContext, Policy);
2182 Scope *S,
Sema &SemaRef, ResultBuilder &Results) {
2190 if (Results.includeCodePatterns()) {
2192 Builder.AddTypedTextChunk(
"namespace");
2194 Builder.AddPlaceholderChunk(
"identifier");
2198 Builder.AddPlaceholderChunk(
"declarations");
2201 Results.AddResult(
Result(Builder.TakeString()));
2205 Builder.AddTypedTextChunk(
"namespace");
2207 Builder.AddPlaceholderChunk(
"name");
2209 Builder.AddPlaceholderChunk(
"namespace");
2211 Results.AddResult(
Result(Builder.TakeString()));
2214 Builder.AddTypedTextChunk(
"using namespace");
2216 Builder.AddPlaceholderChunk(
"identifier");
2218 Results.AddResult(
Result(Builder.TakeString()));
2221 Builder.AddTypedTextChunk(
"asm");
2223 Builder.AddPlaceholderChunk(
"string-literal");
2225 Results.AddResult(
Result(Builder.TakeString()));
2227 if (Results.includeCodePatterns()) {
2229 Builder.AddTypedTextChunk(
"template");
2231 Builder.AddPlaceholderChunk(
"declaration");
2232 Results.AddResult(
Result(Builder.TakeString()));
2243 if (!CurrentModule) {
2245 Builder.AddTypedTextChunk(
"module");
2248 Results.AddResult(
Result(Builder.TakeString()));
2253 if (!CurrentModule ||
2258 Builder.AddTypedTextChunk(
"module");
2260 Builder.AddPlaceholderChunk(
"name");
2263 Results.AddResult(
Result(Builder.TakeString()));
2268 if (!CurrentModule ||
2272 Builder.AddTypedTextChunk(
"import");
2274 Builder.AddPlaceholderChunk(
"name");
2277 Results.AddResult(
Result(Builder.TakeString()));
2280 if (CurrentModule &&
2284 Builder.AddTypedTextChunk(
"module");
2287 Builder.AddTypedTextChunk(
"private");
2290 Results.AddResult(
Result(Builder.TakeString()));
2295 if (!CurrentModule ||
2310 Builder.AddTypedTextChunk(
"using");
2312 Builder.AddPlaceholderChunk(
"qualifier");
2313 Builder.AddTextChunk(
"::");
2314 Builder.AddPlaceholderChunk(
"name");
2316 Results.AddResult(
Result(Builder.TakeString()));
2323 Builder.AddTypedTextChunk(
"using typename");
2325 Builder.AddPlaceholderChunk(
"qualifier");
2326 Builder.AddTextChunk(
"::");
2327 Builder.AddPlaceholderChunk(
"name");
2329 Results.AddResult(
Result(Builder.TakeString()));
2337 bool IsNotInheritanceScope = !S->isClassInheritanceScope();
2339 Builder.AddTypedTextChunk(
"public");
2340 if (IsNotInheritanceScope && Results.includeCodePatterns())
2342 Results.AddResult(
Result(Builder.TakeString()));
2345 Builder.AddTypedTextChunk(
"protected");
2346 if (IsNotInheritanceScope && Results.includeCodePatterns())
2348 Results.AddResult(
Result(Builder.TakeString()));
2351 Builder.AddTypedTextChunk(
"private");
2352 if (IsNotInheritanceScope && Results.includeCodePatterns())
2354 Results.AddResult(
Result(Builder.TakeString()));
2372 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
2374 Builder.AddTypedTextChunk(
"template");
2376 Builder.AddPlaceholderChunk(
"parameters");
2378 Results.AddResult(
Result(Builder.TakeString()));
2416 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
2418 Builder.AddTypedTextChunk(
"try");
2422 Builder.AddPlaceholderChunk(
"statements");
2426 Builder.AddTextChunk(
"catch");
2429 Builder.AddPlaceholderChunk(
"declaration");
2434 Builder.AddPlaceholderChunk(
"statements");
2437 Results.AddResult(
Result(Builder.TakeString()));
2442 if (Results.includeCodePatterns()) {
2444 Builder.AddTypedTextChunk(
"if");
2448 Builder.AddPlaceholderChunk(
"condition");
2450 Builder.AddPlaceholderChunk(
"expression");
2455 Builder.AddPlaceholderChunk(
"statements");
2458 Results.AddResult(
Result(Builder.TakeString()));
2461 Builder.AddTypedTextChunk(
"switch");
2465 Builder.AddPlaceholderChunk(
"condition");
2467 Builder.AddPlaceholderChunk(
"expression");
2472 Builder.AddPlaceholderChunk(
"cases");
2475 Results.AddResult(
Result(Builder.TakeString()));
2482 Builder.AddTypedTextChunk(
"case");
2484 Builder.AddPlaceholderChunk(
"expression");
2486 Results.AddResult(
Result(Builder.TakeString()));
2489 Builder.AddTypedTextChunk(
"default");
2491 Results.AddResult(
Result(Builder.TakeString()));
2494 if (Results.includeCodePatterns()) {
2496 Builder.AddTypedTextChunk(
"while");
2500 Builder.AddPlaceholderChunk(
"condition");
2502 Builder.AddPlaceholderChunk(
"expression");
2507 Builder.AddPlaceholderChunk(
"statements");
2510 Results.AddResult(
Result(Builder.TakeString()));
2513 Builder.AddTypedTextChunk(
"do");
2517 Builder.AddPlaceholderChunk(
"statements");
2520 Builder.AddTextChunk(
"while");
2523 Builder.AddPlaceholderChunk(
"expression");
2525 Results.AddResult(
Result(Builder.TakeString()));
2528 Builder.AddTypedTextChunk(
"for");
2532 Builder.AddPlaceholderChunk(
"init-statement");
2534 Builder.AddPlaceholderChunk(
"init-expression");
2537 Builder.AddPlaceholderChunk(
"condition");
2540 Builder.AddPlaceholderChunk(
"inc-expression");
2545 Builder.AddPlaceholderChunk(
"statements");
2548 Results.AddResult(
Result(Builder.TakeString()));
2552 Builder.AddTypedTextChunk(
"for");
2555 Builder.AddPlaceholderChunk(
"range-declaration");
2558 Builder.AddTextChunk(
"in");
2562 Builder.AddPlaceholderChunk(
"range-expression");
2567 Builder.AddPlaceholderChunk(
"statements");
2570 Results.AddResult(
Result(Builder.TakeString()));
2574 if (S->getContinueParent()) {
2576 Builder.AddTypedTextChunk(
"continue");
2578 Results.AddResult(
Result(Builder.TakeString()));
2581 if (S->getBreakParent()) {
2583 Builder.AddTypedTextChunk(
"break");
2585 Results.AddResult(
Result(Builder.TakeString()));
2591 ReturnType =
Function->getReturnType();
2592 else if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(SemaRef.
CurContext))
2593 ReturnType =
Method->getReturnType();
2598 Builder.AddTypedTextChunk(
"return");
2600 Results.AddResult(
Result(Builder.TakeString()));
2602 assert(!ReturnType.
isNull());
2604 Builder.AddTypedTextChunk(
"return");
2606 Builder.AddPlaceholderChunk(
"expression");
2608 Results.AddResult(
Result(Builder.TakeString()));
2611 Builder.AddTypedTextChunk(
"co_return");
2613 Builder.AddPlaceholderChunk(
"expression");
2615 Results.AddResult(
Result(Builder.TakeString()));
2619 Builder.AddTypedTextChunk(
"return true");
2621 Results.AddResult(
Result(Builder.TakeString()));
2623 Builder.AddTypedTextChunk(
"return false");
2625 Results.AddResult(
Result(Builder.TakeString()));
2630 Builder.AddTypedTextChunk(
"return nullptr");
2632 Results.AddResult(
Result(Builder.TakeString()));
2637 Builder.AddTypedTextChunk(
"goto");
2639 Builder.AddPlaceholderChunk(
"label");
2641 Results.AddResult(
Result(Builder.TakeString()));
2644 Builder.AddTypedTextChunk(
"using namespace");
2646 Builder.AddPlaceholderChunk(
"identifier");
2648 Results.AddResult(
Result(Builder.TakeString()));
2665 Builder.AddTypedTextChunk(
"__bridge");
2667 Builder.AddPlaceholderChunk(
"type");
2669 Builder.AddPlaceholderChunk(
"expression");
2670 Results.AddResult(
Result(Builder.TakeString()));
2673 Builder.AddTypedTextChunk(
"__bridge_transfer");
2675 Builder.AddPlaceholderChunk(
"Objective-C type");
2677 Builder.AddPlaceholderChunk(
"expression");
2678 Results.AddResult(
Result(Builder.TakeString()));
2681 Builder.AddTypedTextChunk(
"__bridge_retained");
2683 Builder.AddPlaceholderChunk(
"CF type");
2685 Builder.AddPlaceholderChunk(
"expression");
2686 Results.AddResult(
Result(Builder.TakeString()));
2697 Builder.AddResultTypeChunk(
"bool");
2698 Builder.AddTypedTextChunk(
"true");
2699 Results.AddResult(
Result(Builder.TakeString()));
2702 Builder.AddResultTypeChunk(
"bool");
2703 Builder.AddTypedTextChunk(
"false");
2704 Results.AddResult(
Result(Builder.TakeString()));
2708 Builder.AddTypedTextChunk(
"dynamic_cast");
2710 Builder.AddPlaceholderChunk(
"type");
2713 Builder.AddPlaceholderChunk(
"expression");
2715 Results.AddResult(
Result(Builder.TakeString()));
2719 Builder.AddTypedTextChunk(
"static_cast");
2721 Builder.AddPlaceholderChunk(
"type");
2724 Builder.AddPlaceholderChunk(
"expression");
2726 Results.AddResult(
Result(Builder.TakeString()));
2729 Builder.AddTypedTextChunk(
"reinterpret_cast");
2731 Builder.AddPlaceholderChunk(
"type");
2734 Builder.AddPlaceholderChunk(
"expression");
2736 Results.AddResult(
Result(Builder.TakeString()));
2739 Builder.AddTypedTextChunk(
"const_cast");
2741 Builder.AddPlaceholderChunk(
"type");
2744 Builder.AddPlaceholderChunk(
"expression");
2746 Results.AddResult(
Result(Builder.TakeString()));
2750 Builder.AddResultTypeChunk(
"std::type_info");
2751 Builder.AddTypedTextChunk(
"typeid");
2753 Builder.AddPlaceholderChunk(
"expression-or-type");
2755 Results.AddResult(
Result(Builder.TakeString()));
2759 Builder.AddTypedTextChunk(
"new");
2761 Builder.AddPlaceholderChunk(
"type");
2763 Builder.AddPlaceholderChunk(
"expressions");
2765 Results.AddResult(
Result(Builder.TakeString()));
2768 Builder.AddTypedTextChunk(
"new");
2770 Builder.AddPlaceholderChunk(
"type");
2772 Builder.AddPlaceholderChunk(
"size");
2775 Builder.AddPlaceholderChunk(
"expressions");
2777 Results.AddResult(
Result(Builder.TakeString()));
2780 Builder.AddResultTypeChunk(
"void");
2781 Builder.AddTypedTextChunk(
"delete");
2783 Builder.AddPlaceholderChunk(
"expression");
2784 Results.AddResult(
Result(Builder.TakeString()));
2787 Builder.AddResultTypeChunk(
"void");
2788 Builder.AddTypedTextChunk(
"delete");
2793 Builder.AddPlaceholderChunk(
"expression");
2794 Results.AddResult(
Result(Builder.TakeString()));
2798 Builder.AddResultTypeChunk(
"void");
2799 Builder.AddTypedTextChunk(
"throw");
2801 Builder.AddPlaceholderChunk(
"expression");
2802 Results.AddResult(
Result(Builder.TakeString()));
2809 Builder.AddResultTypeChunk(
"std::nullptr_t");
2810 Builder.AddTypedTextChunk(
"nullptr");
2811 Results.AddResult(
Result(Builder.TakeString()));
2814 Builder.AddResultTypeChunk(
"size_t");
2815 Builder.AddTypedTextChunk(
"alignof");
2817 Builder.AddPlaceholderChunk(
"type");
2819 Results.AddResult(
Result(Builder.TakeString()));
2822 Builder.AddResultTypeChunk(
"bool");
2823 Builder.AddTypedTextChunk(
"noexcept");
2825 Builder.AddPlaceholderChunk(
"expression");
2827 Results.AddResult(
Result(Builder.TakeString()));
2830 Builder.AddResultTypeChunk(
"size_t");
2831 Builder.AddTypedTextChunk(
"sizeof...");
2833 Builder.AddPlaceholderChunk(
"parameter-pack");
2835 Results.AddResult(
Result(Builder.TakeString()));
2840 Builder.AddTypedTextChunk(
"co_await");
2842 Builder.AddPlaceholderChunk(
"expression");
2843 Results.AddResult(
Result(Builder.TakeString()));
2846 Builder.AddTypedTextChunk(
"co_yield");
2848 Builder.AddPlaceholderChunk(
"expression");
2849 Results.AddResult(
Result(Builder.TakeString()));
2852 Builder.AddResultTypeChunk(
"bool");
2853 Builder.AddTypedTextChunk(
"requires");
2856 Builder.AddPlaceholderChunk(
"parameters");
2861 Builder.AddPlaceholderChunk(
"requirements");
2864 Results.AddResult(
Result(Builder.TakeString()));
2868 Builder.AddTypedTextChunk(
"requires");
2870 Builder.AddPlaceholderChunk(
"expression");
2872 Results.AddResult(
Result(Builder.TakeString()));
2882 if (ID->getSuperClass()) {
2883 std::string SuperType;
2884 SuperType = ID->getSuperClass()->getNameAsString();
2885 if (
Method->isInstanceMethod())
2888 Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
2889 Builder.AddTypedTextChunk(
"super");
2890 Results.AddResult(
Result(Builder.TakeString()));
2899 Builder.AddResultTypeChunk(
"size_t");
2901 Builder.AddTypedTextChunk(
"alignof");
2903 Builder.AddTypedTextChunk(
"_Alignof");
2905 Builder.AddPlaceholderChunk(
"type");
2907 Results.AddResult(
Result(Builder.TakeString()));
2912 Builder.AddResultTypeChunk(
"nullptr_t");
2913 Builder.AddTypedTextChunk(
"nullptr");
2914 Results.AddResult(
Result(Builder.TakeString()));
2918 Builder.AddResultTypeChunk(
"size_t");
2919 Builder.AddTypedTextChunk(
"sizeof");
2921 Builder.AddPlaceholderChunk(
"expression-or-type");
2923 Results.AddResult(
Result(Builder.TakeString()));
2936 Results.AddResult(
Result(
"operator"));
2957 else if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(ND)) {
2959 T =
Method->getSendResultType(BaseType);
2962 }
else if (
const auto *
Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
2964 cast<EnumDecl>(
Enumerator->getDeclContext()));
2965 }
else if (isa<UnresolvedUsingValueDecl>(ND)) {
2967 }
else if (
const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
2969 T = Ivar->getUsageType(BaseType);
2971 T = Ivar->getType();
2972 }
else if (
const auto *
Value = dyn_cast<ValueDecl>(ND)) {
2974 }
else if (
const auto *
Property = dyn_cast<ObjCPropertyDecl>(ND)) {
2984 Result.AddResultTypeChunk(
2991 if (SentinelAttr *Sentinel = FunctionOrMethod->
getAttr<SentinelAttr>())
2992 if (Sentinel->getSentinel() == 0) {
2994 Result.AddTextChunk(
", nil");
2996 Result.AddTextChunk(
", NULL");
2998 Result.AddTextChunk(
", (void*)0");
3019 switch (*nullability) {
3029 Result +=
"null_unspecified ";
3033 llvm_unreachable(
"Not supported as a context-sensitive keyword!");
3050 bool SuppressBlock =
false) {
3056 if (!SuppressBlock) {
3059 TypedefTL.getDecl()->getTypeSourceInfo()) {
3072 TL = AttrTL.getModifiedLoc();
3091 bool SuppressBlockName =
false,
bool SuppressBlock =
false,
3096 bool SuppressName =
false,
bool SuppressBlock =
false,
3104 if (
const auto *PVD = dyn_cast<ParmVarDecl>(Param))
3105 ObjCQual = PVD->getObjCDeclQualifier();
3106 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->
getDeclContext());
3113 if (Param->
getIdentifier() && !ObjCMethodParam && !SuppressName)
3120 if (ObjCMethodParam) {
3139 if (!
Block && ObjCMethodParam &&
3140 cast<ObjCMethodDecl>(Param->
getDeclContext())->isPropertyAccessor()) {
3141 if (
const auto *PD = cast<ObjCMethodDecl>(Param->
getDeclContext())
3142 ->findPropertyDecl(
false))
3156 if (ObjCMethodParam) {
3161 if (
Result.back() !=
')')
3175 false, SuppressBlock,
3191 bool SuppressBlockName,
bool SuppressBlock,
3199 if (!ResultType->
isVoidType() || SuppressBlock)
3204 if (!BlockProto ||
Block.getNumParams() == 0) {
3211 for (
unsigned I = 0, N =
Block.getNumParams(); I != N; ++I) {
3224 if (SuppressBlock) {
3227 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3236 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3256 if (srcText.empty() || srcText ==
"=") {
3262 std::string DefValue(srcText.str());
3265 if (DefValue.at(0) !=
'=') {
3269 return " = " + DefValue;
3271 return " " + DefValue;
3280 bool InOptional =
false) {
3281 bool FirstParameter =
true;
3283 for (
unsigned P = Start, N =
Function->getNumParams();
P != N; ++
P) {
3290 Result.getCodeCompletionTUInfo());
3291 if (!FirstParameter)
3306 FirstParameter =
false;
3318 if (
Function->isVariadic() &&
P == N - 1)
3319 PlaceholderStr +=
", ...";
3322 Result.AddPlaceholderChunk(
3323 Result.getAllocator().CopyString(PlaceholderStr));
3327 if (Proto->isVariadic()) {
3328 if (Proto->getNumParams() == 0)
3329 Result.AddPlaceholderChunk(
"...");
3339 unsigned MaxParameters = 0,
unsigned Start = 0,
bool InDefaultArg =
false) {
3340 bool FirstParameter =
true;
3349 PEnd = Params->
begin() + MaxParameters;
3352 bool HasDefaultArg =
false;
3353 std::string PlaceholderStr;
3355 if (TTP->wasDeclaredWithTypename())
3356 PlaceholderStr =
"typename";
3357 else if (
const auto *TC = TTP->getTypeConstraint()) {
3358 llvm::raw_string_ostream OS(PlaceholderStr);
3359 TC->print(OS, Policy);
3361 PlaceholderStr =
"class";
3363 if (TTP->getIdentifier()) {
3364 PlaceholderStr +=
' ';
3365 PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3368 HasDefaultArg = TTP->hasDefaultArgument();
3370 dyn_cast<NonTypeTemplateParmDecl>(*
P)) {
3371 if (NTTP->getIdentifier())
3372 PlaceholderStr = std::string(NTTP->getIdentifier()->deuglifiedName());
3373 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3374 HasDefaultArg = NTTP->hasDefaultArgument();
3376 assert(isa<TemplateTemplateParmDecl>(*
P));
3381 PlaceholderStr =
"template<...> class";
3383 PlaceholderStr +=
' ';
3390 if (HasDefaultArg && !InDefaultArg) {
3394 Result.getCodeCompletionTUInfo());
3395 if (!FirstParameter)
3398 P - Params->
begin(),
true);
3403 InDefaultArg =
false;
3406 FirstParameter =
false;
3411 Result.AddPlaceholderChunk(
3412 Result.getAllocator().CopyString(PlaceholderStr));
3420 bool QualifierIsInformative,
3426 std::string PrintedNNS;
3428 llvm::raw_string_ostream OS(PrintedNNS);
3429 Qualifier.print(OS, Policy);
3431 if (QualifierIsInformative)
3432 Result.AddInformativeChunk(
Result.getAllocator().CopyString(PrintedNNS));
3434 Result.AddTextChunk(
Result.getAllocator().CopyString(PrintedNNS));
3443 Result.AddInformativeChunk(
" const");
3448 Result.AddInformativeChunk(
" volatile");
3453 Result.AddInformativeChunk(
" restrict");
3458 std::string QualsStr;
3460 QualsStr +=
" const";
3462 QualsStr +=
" volatile";
3464 QualsStr +=
" restrict";
3465 Result.AddInformativeChunk(
Result.getAllocator().CopyString(QualsStr));
3471 if (
auto *CxxMethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(
Function);
3472 CxxMethodDecl && CxxMethodDecl->hasCXXExplicitFunctionObjectParameter()) {
3474 const auto Quals = CxxMethodDecl->getFunctionObjectParameterType();
3475 if (!Quals.hasQualifiers())
3481 if (!Proto || !Proto->getMethodQuals())
3496 switch (ExceptInfo.Type) {
3499 NameAndSignature +=
" noexcept";
3515 switch (Name.getNameKind()) {
3517 const char *OperatorName =
nullptr;
3518 switch (Name.getCXXOverloadedOperator()) {
3520 case OO_Conditional:
3522 OperatorName =
"operator";
3525#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
3527 OperatorName = "operator" Spelling; \
3529#define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3530#include "clang/Basic/OperatorKinds.def"
3533 OperatorName =
"operator new";
3536 OperatorName =
"operator delete";
3539 OperatorName =
"operator new[]";
3541 case OO_Array_Delete:
3542 OperatorName =
"operator delete[]";
3545 OperatorName =
"operator()";
3548 OperatorName =
"operator[]";
3551 Result.AddTypedTextChunk(OperatorName);
3559 Result.AddTypedTextChunk(
3572 QualType Ty = Name.getCXXNameType();
3576 Result.AddTypedTextChunk(
3581 Result.AddTypedTextChunk(
3582 Result.getAllocator().CopyString(
Record->getNameAsString()));
3596 bool IncludeBriefComments) {
3598 CCTUInfo, IncludeBriefComments);
3610 return Result.TakeString();
3621 Result.AddPlaceholderChunk(
"...");
3635 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
3640 Result.AddPlaceholderChunk(
3641 Result.getAllocator().CopyString((*A)->getName()));
3644 return Result.TakeString();
3656 bool IncludeBriefComments) {
3672 Result.addBriefComment(RC->getBriefText(Ctx));
3682 return Result.TakeString();
3686 PP, Ctx,
Result, IncludeBriefComments, CCContext, Policy);
3690 std::string &BeforeName,
3691 std::string &NameAndSignature) {
3692 bool SeenTypedChunk =
false;
3693 for (
auto &Chunk : CCS) {
3695 assert(SeenTypedChunk &&
"optional parameter before name");
3702 NameAndSignature += Chunk.Text;
3704 BeforeName += Chunk.Text;
3716 std::string BeforeName;
3717 std::string NameAndSignature;
3723 const auto *VirtualFunc = dyn_cast<FunctionDecl>(
Declaration);
3724 assert(VirtualFunc &&
"overridden decl must be a function");
3727 NameAndSignature +=
" override";
3729 Result.AddTextChunk(
Result.getAllocator().CopyString(BeforeName));
3731 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(NameAndSignature));
3732 return Result.TakeString();
3738 const auto *VD = dyn_cast<VarDecl>(ND);
3741 const auto *
RecordDecl = VD->getType()->getAsCXXRecordDecl();
3754 if (IncludeBriefComments) {
3757 Result.addBriefComment(RC->getBriefText(Ctx));
3762 Result.AddTypedTextChunk(
3764 Result.AddTextChunk(
"::");
3765 return Result.TakeString();
3769 Result.AddAnnotation(
Result.getAllocator().CopyString(I->getAnnotation()));
3782 if (
const auto *
Function = dyn_cast<FunctionDecl>(ND)) {
3783 AddFunctionTypeAndResult(
Function);
3784 return Result.TakeString();
3787 if (
const auto *CallOperator =
3789 AddFunctionTypeAndResult(CallOperator);
3790 return Result.TakeString();
3796 dyn_cast<FunctionTemplateDecl>(ND)) {
3807 llvm::SmallBitVector Deduced(FunTmpl->getTemplateParameters()->size());
3812 unsigned LastDeducibleArgument;
3813 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
3814 --LastDeducibleArgument) {
3815 if (!Deduced[LastDeducibleArgument - 1]) {
3819 bool HasDefaultArg =
false;
3820 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3821 LastDeducibleArgument - 1);
3823 HasDefaultArg = TTP->hasDefaultArgument();
3825 dyn_cast<NonTypeTemplateParmDecl>(Param))
3826 HasDefaultArg = NTTP->hasDefaultArgument();
3828 assert(isa<TemplateTemplateParmDecl>(Param));
3830 cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
3853 LastDeducibleArgument);
3862 return Result.TakeString();
3865 if (
const auto *
Template = dyn_cast<TemplateDecl>(ND)) {
3868 Result.AddTypedTextChunk(
3873 return Result.TakeString();
3876 if (
const auto *
Method = dyn_cast<ObjCMethodDecl>(ND)) {
3879 Result.AddTypedTextChunk(
3881 return Result.TakeString();
3887 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(SelName));
3889 Result.AddInformativeChunk(
Result.getAllocator().CopyString(SelName));
3893 if (
Method->param_size() == 1)
3894 Result.AddTypedTextChunk(
"");
3900 PEnd =
Method->param_end();
3901 P != PEnd && Idx < Sel.
getNumArgs(); (
void)++
P, ++Idx) {
3920 QualType ParamType = (*P)->getType();
3921 std::optional<ArrayRef<QualType>> ObjCSubsts;
3937 Arg += II->getName();
3940 if (
Method->isVariadic() && (
P + 1) == PEnd)
3944 Result.AddTextChunk(
Result.getAllocator().CopyString(Arg));
3946 Result.AddInformativeChunk(
Result.getAllocator().CopyString(Arg));
3948 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
3951 if (
Method->isVariadic()) {
3952 if (
Method->param_size() == 0) {
3954 Result.AddTextChunk(
", ...");
3956 Result.AddInformativeChunk(
", ...");
3958 Result.AddPlaceholderChunk(
", ...");
3964 return Result.TakeString();
3971 Result.AddTypedTextChunk(
3973 return Result.TakeString();
3984 const auto *M = dyn_cast<ObjCMethodDecl>(ND);
3996 const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
3997 if (!M || !M->isPropertyAccessor())
4020 auto FDecl =
Result.getFunction();
4023 if (ArgIndex < FDecl->getNumParams())
4031 unsigned CurrentArg) {
4032 unsigned ChunkIndex = 0;
4033 auto AddChunk = [&](llvm::StringRef Placeholder) {
4036 const char *
Copy =
Result.getAllocator().CopyString(Placeholder);
4037 if (ChunkIndex == CurrentArg)
4045 if (
auto *CRD = llvm::dyn_cast<CXXRecordDecl>(RD)) {
4046 for (
const auto &
Base : CRD->bases())
4047 AddChunk(
Base.getType().getAsString(Policy));
4049 for (
const auto &Field : RD->
fields())
4059 unsigned CurrentArg,
unsigned Start = 0,
bool InOptional =
false) {
4065 bool FirstParameter =
true;
4066 unsigned NumParams =
4069 for (
unsigned P = Start;
P != NumParams; ++
P) {
4074 Result.getCodeCompletionTUInfo());
4075 if (!FirstParameter)
4079 PrototypeLoc, Opt, CurrentArg,
P,
4089 Function->getParamDecl(
P)->isExplicitObjectParameter()) {
4094 FirstParameter =
false;
4101 std::string Placeholder;
4102 assert(P < Prototype->getNumParams());
4111 Placeholder =
Prototype->getParamType(
P).getAsString(Policy);
4114 if (
P == CurrentArg)
4115 Result.AddCurrentParameterChunk(
4116 Result.getAllocator().CopyString(Placeholder));
4118 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Placeholder));
4123 Result.getCodeCompletionTUInfo());
4124 if (!FirstParameter)
4127 if (CurrentArg < NumParams)
4139 if (
const auto *
Type = dyn_cast<TemplateTypeParmDecl>(Param)) {
4141 }
else if (
const auto *
NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
4143 }
else if (
const auto *
Template = dyn_cast<TemplateTemplateParmDecl>(Param)) {
4147 llvm::raw_string_ostream OS(
Result);
4148 Param->
print(OS, Policy);
4154 if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(TD))
4155 return CTD->getTemplatedDecl()->getKindName().str();
4156 if (
const auto *VTD = dyn_cast<VarTemplateDecl>(TD))
4157 return VTD->getTemplatedDecl()->getType().getAsString(Policy);
4158 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
4159 return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy);
4160 if (isa<TypeAliasTemplateDecl>(TD))
4162 if (isa<TemplateTemplateParmDecl>(TD))
4164 if (isa<ConceptDecl>(TD))
4174 Builder.getCodeCompletionTUInfo());
4176 if (!ResultType.empty())
4177 Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType));
4178 Builder.AddTextChunk(
4184 for (
unsigned I = 0; I < Params.size(); ++I) {
4186 std::string Placeholder =
4189 Current = &OptionalBuilder;
4192 Current->AddChunk(I == CurrentArg
4195 Current->getAllocator().CopyString(Placeholder));
4198 if (Current == &OptionalBuilder)
4199 Builder.AddOptionalChunk(OptionalBuilder.
TakeString());
4203 if (isa<FunctionTemplateDecl>(TD))
4204 Builder.AddInformativeChunk(
"()");
4205 return Builder.TakeString();
4212 bool Braced)
const {
4236 if (IncludeBriefComments) {
4243 llvm::raw_string_ostream OS(Name);
4245 Result.AddTextChunk(
Result.getAllocator().CopyString(Name));
4248 Result.AddResultTypeChunk(
Result.getAllocator().CopyString(
4263 return Result.TakeString();
4268 bool PreferredTypeIsPointer) {
4272 if (MacroName ==
"nil" || MacroName ==
"NULL" || MacroName ==
"Nil") {
4274 if (PreferredTypeIsPointer)
4278 else if (MacroName ==
"YES" || MacroName ==
"NO" || MacroName ==
"true" ||
4279 MacroName ==
"false")
4282 else if (MacroName ==
"bool")
4295 case Decl::EnumConstant:
4299 case Decl::Function:
4301 case Decl::ObjCCategory:
4303 case Decl::ObjCCategoryImpl:
4305 case Decl::ObjCImplementation:
4308 case Decl::ObjCInterface:
4310 case Decl::ObjCIvar:
4312 case Decl::ObjCMethod:
4313 return cast<ObjCMethodDecl>(
D)->isInstanceMethod()
4316 case Decl::CXXMethod:
4318 case Decl::CXXConstructor:
4320 case Decl::CXXDestructor:
4322 case Decl::CXXConversion:
4324 case Decl::ObjCProperty:
4326 case Decl::ObjCProtocol:
4332 case Decl::TypeAlias:
4334 case Decl::TypeAliasTemplate:
4338 case Decl::Namespace:
4340 case Decl::NamespaceAlias:
4342 case Decl::TemplateTypeParm:
4344 case Decl::NonTypeTemplateParm:
4346 case Decl::TemplateTemplateParm:
4348 case Decl::FunctionTemplate:
4350 case Decl::ClassTemplate:
4352 case Decl::AccessSpec:
4354 case Decl::ClassTemplatePartialSpecialization:
4356 case Decl::UsingDirective:
4358 case Decl::StaticAssert:
4362 case Decl::TranslationUnit:
4366 case Decl::UnresolvedUsingValue:
4367 case Decl::UnresolvedUsingTypename:
4370 case Decl::UsingEnum:
4373 case Decl::ObjCPropertyImpl:
4374 switch (cast<ObjCPropertyImplDecl>(
D)->getPropertyImplementation()) {
4381 llvm_unreachable(
"Unexpected Kind!");
4386 case Decl::ObjCTypeParam:
4392 case Decl::LinkageSpec:
4396 if (
const auto *TD = dyn_cast<TagDecl>(
D)) {
4397 switch (TD->getTagKind()) {
4415 bool LoadExternal,
bool IncludeUndefined,
4416 bool TargetTypeIsPointer =
false) {
4419 Results.EnterNewScope();
4425 if (IncludeUndefined || MD) {
4433 TargetTypeIsPointer)));
4437 Results.ExitScope();
4441 ResultBuilder &Results) {
4444 Results.EnterNewScope();
4448 if (LangOpts.C99 || LangOpts.CPlusPlus11)
4450 Results.ExitScope();
4457 unsigned NumResults) {
4520 llvm_unreachable(
"Invalid ParserCompletionContext!");
4532 ResultBuilder &Results) {
4535 while (isa<BlockDecl>(CurContext))
4544 for (
auto *
P :
Method->parameters())
4545 if (!
P->getDeclName())
4551 Results.getCodeCompletionTUInfo());
4552 if (Overridden->getCanonicalDecl() ==
Method->getCanonicalDecl())
4558 S.
Context, CurContext, Overridden->getDeclContext());
4561 llvm::raw_string_ostream OS(Str);
4562 NNS.
print(OS, Policy);
4563 Builder.AddTextChunk(Results.getAllocator().CopyString(Str));
4565 }
else if (!InContext->
Equals(Overridden->getDeclContext()))
4568 Builder.AddTypedTextChunk(
4569 Results.getAllocator().CopyString(Overridden->getNameAsString()));
4571 bool FirstParam =
true;
4572 for (
auto *
P :
Method->parameters()) {
4578 Builder.AddPlaceholderChunk(
4579 Results.getAllocator().CopyString(
P->getIdentifier()->getName()));
4585 Results.Ignore(Overridden);
4592 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4593 CodeCompleter->getCodeCompletionTUInfo(),
4595 Results.EnterNewScope();
4604 for (
unsigned I = 0, N = Modules.size(); I != N; ++I) {
4605 Builder.AddTypedTextChunk(
4606 Builder.getAllocator().CopyString(Modules[I]->Name));
4607 Results.AddResult(
Result(
4612 }
else if (getLangOpts().Modules) {
4620 Builder.AddTypedTextChunk(
4621 Builder.getAllocator().CopyString(Submodule->Name));
4622 Results.AddResult(
Result(
4629 Results.ExitScope();
4631 Results.getCompletionContext(), Results.data(),
4637 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4638 CodeCompleter->getCodeCompletionTUInfo(),
4640 Results.EnterNewScope();
4645 switch (CompletionContext) {
4648 case PCC_ObjCInterface:
4649 case PCC_ObjCImplementation:
4650 case PCC_ObjCInstanceVariableList:
4652 case PCC_MemberTemplate:
4654 case PCC_LocalDeclarationSpecifiers:
4655 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4659 case PCC_TopLevelOrExpression:
4660 case PCC_ParenthesizedExpression:
4661 case PCC_Expression:
4665 Results.setFilter(&ResultBuilder::IsOrdinaryName);
4667 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4673 case PCC_RecoveryInFunction:
4679 if (ThisType.isNull()) {
4681 if (
auto *MethodDecl = llvm::dyn_cast_if_present<CXXMethodDecl>(
4683 Results.setExplicitObjectMemberFn(
4684 MethodDecl->isExplicitObjectMemberFunction());
4688 Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4692 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
4694 CodeCompleter->includeGlobals(),
4695 CodeCompleter->loadExternal());
4698 Results.ExitScope();
4700 switch (CompletionContext) {
4701 case PCC_ParenthesizedExpression:
4702 case PCC_Expression:
4704 case PCC_TopLevelOrExpression:
4705 case PCC_RecoveryInFunction:
4706 if (S->getFnParent())
4712 case PCC_ObjCInterface:
4713 case PCC_ObjCImplementation:
4714 case PCC_ObjCInstanceVariableList:
4716 case PCC_MemberTemplate:
4720 case PCC_LocalDeclarationSpecifiers:
4724 if (CodeCompleter->includeMacros())
4728 Results.getCompletionContext(), Results.data(),
4735 bool AtArgumentExpression,
bool IsSuper,
4736 ResultBuilder &Results);
4739 bool AllowNonIdentifiers,
4740 bool AllowNestedNameSpecifiers) {
4742 ResultBuilder Results(
4743 SemaRef, CodeCompleter->getAllocator(),
4744 CodeCompleter->getCodeCompletionTUInfo(),
4745 AllowNestedNameSpecifiers
4750 Results.EnterNewScope();
4753 Results.AddResult(
Result(
"const"));
4754 Results.AddResult(
Result(
"volatile"));
4755 if (getLangOpts().
C99)
4756 Results.AddResult(
Result(
"restrict"));
4762 Results.AddResult(
"final");
4764 if (AllowNonIdentifiers) {
4765 Results.AddResult(
Result(
"operator"));
4769 if (AllowNestedNameSpecifiers) {
4770 Results.allowNestedNameSpecifiers();
4771 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4772 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
4774 Consumer, CodeCompleter->includeGlobals(),
4775 CodeCompleter->loadExternal());
4776 Results.setFilter(
nullptr);
4779 Results.ExitScope();
4785 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4804 Results.getCompletionContext(), Results.data(),
4809 if (
Scope ==
"clang")
4817 if (
Scope ==
"_Clang")
4819 if (
Scope ==
"__gnu__")
4827 if (Completion == AttributeCompletion::None)
4829 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4830 CodeCompleter->getCodeCompletionTUInfo(),
4843 llvm::StringRef InScopeName;
4844 bool InScopeUnderscore =
false;
4846 InScopeName = InScope->
getName();
4848 InScopeName = NoUnderscore;
4849 InScopeUnderscore =
true;
4856 llvm::DenseSet<llvm::StringRef> FoundScopes;
4858 if (A.IsTargetSpecific &&
4859 !A.existsInTarget(getASTContext().getTargetInfo()))
4861 if (!A.acceptsLangOpts(getLangOpts()))
4863 for (
const auto &S : A.Spellings) {
4864 if (S.Syntax != Syntax)
4866 llvm::StringRef Name = S.NormalizedFullName;
4867 llvm::StringRef
Scope;
4870 std::tie(
Scope, Name) = Name.split(
"::");
4872 std::swap(Name,
Scope);
4876 if (Completion == AttributeCompletion::Scope) {
4878 if (!
Scope.empty() && FoundScopes.insert(
Scope).second) {
4889 if (!InScopeName.empty()) {
4890 if (
Scope != InScopeName)
4895 auto Add = [&](llvm::StringRef
Scope, llvm::StringRef Name,
4898 Results.getCodeCompletionTUInfo());
4900 if (!
Scope.empty()) {
4909 Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
Text));
4911 if (!A.ArgNames.empty()) {
4914 for (
const char *Arg : A.ArgNames) {
4918 Builder.AddPlaceholderChunk(Arg);
4923 Results.AddResult(Builder.TakeString());
4930 if (!InScopeUnderscore)
4931 Add(
Scope, Name,
false);
4936 if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
4937 if (
Scope.empty()) {
4938 Add(
Scope, Name,
true);
4943 Add(GuardedScope, Name,
true);
4953 for (
const auto &Entry : ParsedAttrInfoRegistry::entries())
4954 AddCompletions(*Entry.instantiate());
4957 Results.getCompletionContext(), Results.data(),
4963 bool IsParenthesized =
false)
4964 : PreferredType(PreferredType), IntegralConstantExpression(
false),
4965 ObjCCollection(
false), IsParenthesized(IsParenthesized) {}
4976struct CoveredEnumerators {
4984 const CoveredEnumerators &Enumerators) {
4986 if (Context.
getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
4993 Results.EnterNewScope();
4994 for (
auto *
E :
Enum->enumerators()) {
4995 if (Enumerators.Seen.count(
E))
4999 Results.AddResult(R, CurContext,
nullptr,
false);
5001 Results.ExitScope();
5007 assert(!
T.isNull());
5030 if (!Results.includeCodePatterns())
5033 Results.getCodeCompletionTUInfo());
5038 if (!Parameters.empty()) {
5047 constexpr llvm::StringLiteral NamePlaceholder =
"!#!NAME_GOES_HERE!#!";
5048 std::string
Type = std::string(NamePlaceholder);
5050 llvm::StringRef Prefix, Suffix;
5051 std::tie(Prefix, Suffix) = llvm::StringRef(
Type).split(NamePlaceholder);
5052 Prefix = Prefix.rtrim();
5053 Suffix = Suffix.ltrim();
5076 ResultBuilder Results(
5077 SemaRef, CodeCompleter->getAllocator(),
5078 CodeCompleter->getCodeCompletionTUInfo(),
5080 Data.IsParenthesized
5083 Data.PreferredType));
5085 Data.IsParenthesized ? PCC_ParenthesizedExpression : PCC_Expression;
5086 if (
Data.ObjCCollection)
5087 Results.setFilter(&ResultBuilder::IsObjCCollection);
5088 else if (
Data.IntegralConstantExpression)
5089 Results.setFilter(&ResultBuilder::IsIntegralConstantValue);
5091 Results.setFilter(&ResultBuilder::IsOrdinaryName);
5093 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
5095 if (!
Data.PreferredType.isNull())
5096 Results.setPreferredType(
Data.PreferredType.getNonReferenceType());
5099 for (
unsigned I = 0, N =
Data.IgnoreDecls.size(); I != N; ++I)
5100 Results.Ignore(
Data.IgnoreDecls[I]);
5102 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
5104 CodeCompleter->includeGlobals(),
5105 CodeCompleter->loadExternal());
5107 Results.EnterNewScope();
5109 Results.ExitScope();
5111 bool PreferredTypeIsPointer =
false;
5112 if (!
Data.PreferredType.isNull()) {
5113 PreferredTypeIsPointer =
Data.PreferredType->isAnyPointerType() ||
5114 Data.PreferredType->isMemberPointerType() ||
5115 Data.PreferredType->isBlockPointerType();
5116 if (
auto *
Enum =
Data.PreferredType->getAsEnumDecl()) {
5120 CoveredEnumerators());
5124 if (S->getFnParent() && !
Data.ObjCCollection &&
5125 !
Data.IntegralConstantExpression)
5128 if (CodeCompleter->includeMacros())
5130 PreferredTypeIsPointer);
5140 Results.getCompletionContext(), Results.data(),
5146 bool IsParenthesized) {
5147 return CodeCompleteExpression(
5154 CodeCompleteExpression(S, PreferredType);
5155 else if (getLangOpts().
ObjC)
5156 CodeCompleteObjCInstanceMessage(S,
E.get(), {},
false);
5173 if (Protocol->hasDefinition())
5174 return Protocol->getDefinition();
5188 Builder.AddResultTypeChunk(
5190 Policy, Builder.getAllocator()));
5196 Builder.AddPlaceholderChunk(
"...");
5198 for (
unsigned I = 0, N = BlockLoc.
getNumParams(); I != N; ++I) {
5203 std::string PlaceholderStr =
5206 if (I == N - 1 && BlockProtoLoc &&
5208 PlaceholderStr +=
", ...";
5211 Builder.AddPlaceholderChunk(
5212 Builder.getAllocator().CopyString(PlaceholderStr));
5222 bool AllowNullaryMethods,
DeclContext *CurContext,
5224 bool IsBaseExprStatement =
false,
5225 bool IsClassProperty =
false,
bool InOriginalClass =
true) {
5233 if (!AddedProperties.insert(
P->getIdentifier()).second)
5238 if (!
P->getType().getTypePtr()->isBlockPointerType() ||
5239 !IsBaseExprStatement) {
5241 Result(
P, Results.getBasePriority(
P), std::nullopt);
5242 if (!InOriginalClass)
5244 Results.MaybeAddResult(R, CurContext);
5256 Result(
P, Results.getBasePriority(
P), std::nullopt);
5257 if (!InOriginalClass)
5259 Results.MaybeAddResult(R, CurContext);
5266 Results.getCodeCompletionTUInfo());
5269 BlockLoc, BlockProtoLoc);
5270 Result R =
Result(Builder.TakeString(),
P, Results.getBasePriority(
P));
5271 if (!InOriginalClass)
5273 Results.MaybeAddResult(R, CurContext);
5277 if (!
P->isReadOnly()) {
5279 Results.getCodeCompletionTUInfo());
5283 Builder.AddTypedTextChunk(
5284 Results.getAllocator().CopyString(
P->getName()));
5289 BlockProtoLoc,
true);
5291 Builder.AddPlaceholderChunk(
5292 Builder.getAllocator().CopyString(PlaceholderStr));
5300 Result(Builder.TakeString(),
P,
5301 Results.getBasePriority(
P) +
5305 if (!InOriginalClass)
5307 Results.MaybeAddResult(R, CurContext);
5311 if (IsClassProperty) {
5312 for (
const auto *
P : Container->class_properties())
5315 for (
const auto *
P : Container->instance_properties())
5320 if (AllowNullaryMethods) {
5321 ASTContext &Context = Container->getASTContext();
5325 const IdentifierInfo *Name = M->getSelector().getIdentifierInfoForSlot(0);
5328 if (!AddedProperties.insert(Name).second)
5331 Results.getCodeCompletionTUInfo());
5333 Builder.AddTypedTextChunk(
5334 Results.getAllocator().CopyString(Name->getName()));
5337 if (!InOriginalClass)
5339 Results.MaybeAddResult(R, CurContext);
5342 if (IsClassProperty) {
5343 for (
const auto *M : Container->methods()) {
5347 if (!M->getSelector().isUnarySelector() ||
5348 M->getReturnType()->isVoidType() || M->isInstanceMethod())
5353 for (
auto *M : Container->methods()) {
5354 if (M->getSelector().isUnarySelector())
5362 for (
auto *
P : Protocol->protocols())
5364 CurContext, AddedProperties, Results,
5365 IsBaseExprStatement, IsClassProperty,
5368 dyn_cast<ObjCInterfaceDecl>(Container)) {
5369 if (AllowCategories) {
5371 for (
auto *Cat : IFace->known_categories())
5373 CurContext, AddedProperties, Results,
5374 IsBaseExprStatement, IsClassProperty,
5379 for (
auto *I : IFace->all_referenced_protocols())
5381 CurContext, AddedProperties, Results,
5382 IsBaseExprStatement, IsClassProperty,
5386 if (IFace->getSuperClass())
5388 AllowNullaryMethods, CurContext, AddedProperties,
5389 Results, IsBaseExprStatement, IsClassProperty,
5392 dyn_cast<ObjCCategoryDecl>(Container)) {
5396 CurContext, AddedProperties, Results,
5397 IsBaseExprStatement, IsClassProperty,
5406 std::optional<FixItHint> AccessOpFixIt) {
5409 Results.setObjectTypeQualifiers(BaseType.
getQualifiers(), BaseKind);
5412 Results.allowNestedNameSpecifiers();
5413 std::vector<FixItHint> FixIts;
5415 FixIts.emplace_back(*AccessOpFixIt);
5416 CodeCompletionDeclConsumer Consumer(Results, RD, BaseType, std::move(FixIts));
5424 if (!Results.empty()) {
5430 for (
Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
5432 IsDependent = Ctx->isDependentContext();
5448 BaseType = Resolver.
simplifyType(BaseType,
nullptr,
false);
5449 return dyn_cast_if_present<RecordDecl>(
5490 std::optional<SmallVector<QualType, 1>> ArgTypes;
5492 enum AccessOperator {
5509 std::string AsString;
5511 llvm::raw_string_ostream OS(AsString);
5512 QualType ExactType = deduceType(*ResultType);
5518 B.AddResultTypeChunk(
Alloc.CopyString(AsString));
5521 B.AddTypedTextChunk(
Alloc.CopyString(Name->getName()));
5533 B.AddPlaceholderChunk(
Alloc.CopyString(
5538 return B.TakeString();
5546 auto *TemplatedEntity = getTemplatedEntity(BaseType.
getDecl(), S);
5548 constraintsForTemplatedEntity(TemplatedEntity))
5549 believe(AC.ConstraintExpr, &BaseType);
5552 std::vector<Member> members() {
5553 std::vector<Member> Results;
5554 for (
const auto &
E : this->Results)
5555 Results.push_back(
E.second);
5556 llvm::sort(Results, [](
const Member &L,
const Member &R) {
5557 return L.Name->getName() < R.Name->getName();
5567 if (
auto *CSE = dyn_cast<ConceptSpecializationExpr>(
E)) {
5581 for (
const auto &Arg : CSE->getTemplateArguments()) {
5582 if (Index >= Params->
size())
5584 if (isApprox(Arg,
T)) {
5585 auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Params->
getParam(Index));
5589 auto *TT = cast<TemplateTypeParmType>(TTPD->getTypeForDecl());
5597 }
else if (
auto *BO = dyn_cast<BinaryOperator>(
E)) {
5600 if (BO->getOpcode() == BO_LAnd || BO->getOpcode() == BO_LOr) {
5601 believe(BO->getLHS(),
T);
5602 believe(BO->getRHS(),
T);
5604 }
else if (
auto *RE = dyn_cast<RequiresExpr>(
E)) {
5607 if (!Req->isDependent())
5611 if (
auto *TR = dyn_cast<concepts::TypeRequirement>(Req)) {
5613 QualType AssertedType = TR->getType()->getType();
5614 ValidVisitor(
this,
T).TraverseType(AssertedType);
5615 }
else if (
auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
5616 ValidVisitor Visitor(
this,
T);
5620 if (ER->getReturnTypeRequirement().isTypeConstraint()) {
5622 ER->getReturnTypeRequirement().getTypeConstraint();
5623 Visitor.OuterExpr = ER->getExpr();
5625 Visitor.TraverseStmt(ER->getExpr());
5626 }
else if (
auto *NR = dyn_cast<concepts::NestedRequirement>(Req)) {
5627 believe(NR->getConstraintExpr(),
T);
5644 Expr *OuterExpr =
nullptr;
5648 : Outer(Outer),
T(
T) {
5655 const Type *
Base =
E->getBaseType().getTypePtr();
5656 bool IsArrow =
E->isArrow();
5657 if (
Base->isPointerType() && IsArrow) {
5659 Base =
Base->getPointeeType().getTypePtr();
5661 if (isApprox(
Base,
T))
5662 addValue(
E,
E->getMember(), IsArrow ? Member::Arrow : Member::Dot);
5669 if (
Qualifier.getKind() == NestedNameSpecifier::Kind::Type &&
5671 addValue(
E,
E->getDeclName(), Member::Colons);
5678 if (Q.
getKind() == NestedNameSpecifier::Kind::Type &&
5689 if (NNS.
getKind() == NestedNameSpecifier::Kind::Type) {
5692 Q.
getKind() == NestedNameSpecifier::Kind::Type &&
5694 if (
const auto *DNT = dyn_cast_or_null<DependentNameType>(NNST))
5706 bool VisitCallExpr(
CallExpr *CE)
override {
5713 void addResult(
Member &&M) {
5714 auto R = Outer->Results.try_emplace(M.Name);
5715 Member &O = R.first->second;
5719 std::make_tuple(M.ArgTypes.has_value(), M.ResultType !=
nullptr,
5720 M.Operator) > std::make_tuple(O.ArgTypes.has_value(),
5721 O.ResultType !=
nullptr,
5731 M.Operator = Member::Colons;
5732 addResult(std::move(M));
5736 Member::AccessOperator Operator) {
5737 if (!Name.isIdentifier())
5740 Result.Name = Name.getAsIdentifierInfo();
5741 Result.Operator = Operator;
5744 if (Caller !=
nullptr && Callee ==
E) {
5745 Result.ArgTypes.emplace();
5746 for (
const auto *Arg : Caller->
arguments())
5747 Result.ArgTypes->push_back(Arg->getType());
5748 if (Caller == OuterExpr) {
5749 Result.ResultType = OuterType;
5753 Result.ResultType = OuterType;
5755 addResult(std::move(Result));
5764 static bool isApprox(
const Type *T1,
const Type *T2) {
5777 Scope *Inner =
nullptr;
5779 if (S->isTemplateParamScope() && S->isDeclScope(
D))
5780 return Inner ? Inner->getEntity() :
nullptr;
5796 TD->getAssociatedConstraints(Result);
5798 if (
const auto *CTPSD =
5799 dyn_cast<ClassTemplatePartialSpecializationDecl>(DC))
5800 CTPSD->getAssociatedConstraints(Result);
5801 if (
const auto *VTPSD = dyn_cast<VarTemplatePartialSpecializationDecl>(DC))
5802 VTPSD->getAssociatedConstraints(Result);
5813 if (
const auto *Args =
T.getTemplateArgsAsWritten())
5814 if (Args->getNumTemplateArgs() == 1) {
5815 const auto &Arg = Args->arguments().front().getArgument();
5822 llvm::DenseMap<const IdentifierInfo *, Member> Results;
5833 if (
auto *ICE = dyn_cast<ImplicitCastExpr>(
E);
5834 !ICE || ICE->getCastKind() != CK_ArrayToPointerDecay)
5840 Decls.size() == 1) {
5841 if (
const auto *TD = dyn_cast<TypeDecl>(Decls[0]))
5842 return TD->getASTContext().getTypeDeclType(TD);
5846 if (!
Unresolved->isSpecificBuiltinType(BuiltinType::Dependent)) {
5848 if (!
Auto || !
Auto->isUndeducedAutoType())
5852 if (
const CallExpr *CE = llvm::dyn_cast<CallExpr>(
E)) {
5855 Callee->isSpecificPlaceholderType(BuiltinType::BoundMember))
5861 Callee = FnTypePtr->getPointeeType();
5863 Callee = BPT->getPointeeType();
5866 return FnType->getReturnType().getNonReferenceType();
5869 if (
const auto *OE = llvm::dyn_cast<OverloadExpr>(CE->
getCallee())) {
5873 const Type *Common =
nullptr;
5874 for (
const auto *
D : OE->decls()) {
5876 if (
const auto *FD = llvm::dyn_cast<FunctionDecl>(
D))
5877 ReturnType = FD->getReturnType();
5878 else if (
const auto *FTD = llvm::dyn_cast<FunctionTemplateDecl>(
D))
5879 ReturnType = FTD->getTemplatedDecl()->getReturnType();
5882 const Type *Candidate =
5884 if (Common && Common != Candidate)
5888 if (Common !=
nullptr)
5893 if (
const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(
E)) {
5895 if (
const auto *VD = dyn_cast<ValueDecl>(
Member)) {
5896 return VD->getType().getNonReferenceType();
5901 if (
const auto *DRE = llvm::dyn_cast<DeclRefExpr>(
E)) {
5902 if (
const auto *VD = llvm::dyn_cast<VarDecl>(DRE->getDecl())) {
5904 return getApproximateType(VD->getInit(), Resolver);
5907 if (
const auto *UO = llvm::dyn_cast<UnaryOperator>(
E)) {
5908 if (UO->getOpcode() == UnaryOperatorKind::UO_Deref) {
5912 getApproximateType(UO->getSubExpr(), Resolver)->getPointeeType();
5927 if (
auto *PLE = llvm::dyn_cast_or_null<ParenListExpr>(
Base)) {
5928 if (PLE->getNumExprs() == 0)
5930 Base = PLE->getExpr(PLE->getNumExprs() - 1);
5939 bool IsBaseExprStatement,
QualType PreferredType) {
5941 OtherOpBase = unwrapParenList(OtherOpBase);
5942 if (!
Base || !CodeCompleter)
5950 getApproximateType(ConvertedBase.
get(), Resolver);
5957 ConvertedBaseType = PointeeType;
5974 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
5975 CodeCompleter->getCodeCompletionTUInfo(), CCContext,
5976 &ResultBuilder::IsMember);
5978 auto DoCompletion = [&](
Expr *
Base,
bool IsArrow,
5979 std::optional<FixItHint> AccessOpFixIt) ->
bool {
5989 QualType BaseType = getApproximateType(
Base, Resolver);
5997 BaseType = PointeeType;
6009 RD, std::move(AccessOpFixIt));
6010 }
else if (
const auto *TTPT =
6011 dyn_cast<TemplateTypeParmType>(BaseType.
getTypePtr())) {
6013 IsArrow ? ConceptInfo::Member::Arrow : ConceptInfo::Member::Dot;
6014 for (
const auto &R : ConceptInfo(*TTPT, S).members()) {
6015 if (R.Operator != Operator)
6018 R.render(SemaRef, CodeCompleter->getAllocator(),
6019 CodeCompleter->getCodeCompletionTUInfo()));
6021 Result.FixIts.push_back(*AccessOpFixIt);
6022 Results.AddResult(std::move(
Result));
6028 if (AccessOpFixIt) {
6036 assert(ObjCPtr &&
"Non-NULL pointer guaranteed above!");
6039 AddedProperties, Results, IsBaseExprStatement);
6045 SemaRef.
CurContext, AddedProperties, Results,
6046 IsBaseExprStatement,
false,
6053 if (AccessOpFixIt) {
6059 Class = ObjCPtr->getInterfaceDecl();
6065 CodeCompletionDeclConsumer Consumer(Results,
Class, BaseType);
6066 Results.setFilter(&ResultBuilder::IsObjCIvar);
6068 CodeCompleter->includeGlobals(),
6070 CodeCompleter->loadExternal());
6078 Results.EnterNewScope();
6080 bool CompletionSucceded = DoCompletion(
Base, IsArrow, std::nullopt);
6081 if (CodeCompleter->includeFixIts()) {
6084 CompletionSucceded |= DoCompletion(
6085 OtherOpBase, !IsArrow,
6089 Results.ExitScope();
6091 if (!CompletionSucceded)
6096 Results.getCompletionContext(), Results.data(),
6102 bool IsBaseExprStatement) {
6110 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6111 CodeCompleter->getCodeCompletionTUInfo(), CCContext,
6112 &ResultBuilder::IsMember);
6113 Results.EnterNewScope();
6117 AddedProperties, Results, IsBaseExprStatement,
6119 Results.ExitScope();
6121 Results.getCompletionContext(), Results.data(),
6129 ResultBuilder::LookupFilter Filter =
nullptr;
6134 Filter = &ResultBuilder::IsEnum;
6139 Filter = &ResultBuilder::IsUnion;
6146 Filter = &ResultBuilder::IsClassOrStruct;
6151 llvm_unreachable(
"Unknown type specifier kind in CodeCompleteTag");
6154 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6155 CodeCompleter->getCodeCompletionTUInfo(), ContextKind);
6156 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
6159 Results.setFilter(Filter);
6161 CodeCompleter->includeGlobals(),
6162 CodeCompleter->loadExternal());
6164 if (CodeCompleter->includeGlobals()) {
6166 Results.setFilter(&ResultBuilder::IsNestedNameSpecifier);
6168 CodeCompleter->includeGlobals(),
6169 CodeCompleter->loadExternal());
6173 Results.getCompletionContext(), Results.data(),
6180 Results.AddResult(
"const");
6182 Results.AddResult(
"volatile");
6184 Results.AddResult(
"restrict");
6186 Results.AddResult(
"_Atomic");
6188 Results.AddResult(
"__unaligned");
6192 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6193 CodeCompleter->getCodeCompletionTUInfo(),
6195 Results.EnterNewScope();
6197 Results.ExitScope();
6199 Results.getCompletionContext(), Results.data(),
6205 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6206 CodeCompleter->getCodeCompletionTUInfo(),
6208 Results.EnterNewScope();
6211 Results.AddResult(
"noexcept");
6213 !
D.isStaticMember()) {
6215 Results.AddResult(
"final");
6217 Results.AddResult(
"override");
6220 Results.ExitScope();
6222 Results.getCompletionContext(), Results.data(),
6227 CodeCompleteExpression(S,
QualType(getASTContext().getSizeType()));
6243 Data.IntegralConstantExpression =
true;
6244 CodeCompleteExpression(S,
Data);
6252 CoveredEnumerators Enumerators;
6254 SC = SC->getNextSwitchCase()) {
6255 CaseStmt *Case = dyn_cast<CaseStmt>(SC);
6260 if (
auto *DRE = dyn_cast<DeclRefExpr>(CaseVal))
6262 dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
6282 Enumerators.SuggestedQualifier = DRE->getQualifier();
6287 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6288 CodeCompleter->getCodeCompletionTUInfo(),
6293 if (CodeCompleter->includeMacros()) {
6297 Results.getCompletionContext(), Results.data(),
6302 if (Args.size() && !Args.data())
6305 for (
unsigned I = 0; I != Args.size(); ++I)
6326 if (Candidate.Function) {
6327 if (Candidate.Function->isDeleted())
6330 Candidate.Function) &&
6331 Candidate.Function->getNumParams() <= ArgSize &&
6340 if (Candidate.Viable)
6354 for (
auto &Candidate : Candidates) {
6355 QualType CandidateParamType = Candidate.getParamType(N);
6356 if (CandidateParamType.
isNull())
6358 if (ParamType.
isNull()) {
6359 ParamType = CandidateParamType;
6376 if (Candidates.empty())
6380 SemaRef, CurrentArg, Candidates.data(), Candidates.size(), OpenParLoc,
6388 Fn = unwrapParenList(Fn);
6389 if (!CodeCompleter || !Fn)
6399 auto ArgsWithoutDependentTypes =
6404 Expr *NakedFn = Fn->IgnoreParenCasts();
6410 if (
auto ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn)) {
6414 }
else if (
auto UME = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
6416 if (UME->hasExplicitTemplateArgs()) {
6417 UME->copyTemplateArgumentsInto(TemplateArgsBuffer);
6418 TemplateArgs = &TemplateArgsBuffer;
6423 1, UME->isImplicitAccess() ?
nullptr : UME->getBase());
6424 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6425 ArgsWithoutDependentTypes.end());
6427 Decls.
append(UME->decls_begin(), UME->decls_end());
6428 const bool FirstArgumentIsBase = !UME->isImplicitAccess() && UME->getBase();
6432 FirstArgumentIsBase);
6435 if (
auto *MCE = dyn_cast<MemberExpr>(NakedFn))
6436 FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
6437 else if (
auto *DRE = dyn_cast<DeclRefExpr>(NakedFn))
6438 FD = dyn_cast<FunctionDecl>(DRE->getDecl());
6446 ArgsWithoutDependentTypes, CandidateSet,
6456 getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
6461 ArgExprs.append(ArgsWithoutDependentTypes.begin(),
6462 ArgsWithoutDependentTypes.end());
6480 ArgsWithoutDependentTypes.size(),
6516static std::optional<unsigned>
6519 static constexpr unsigned Invalid = std::numeric_limits<unsigned>::max();
6525 unsigned ArgsAfterDesignator = 0;
6526 for (
const Expr *Arg : Args) {
6527 if (
const auto *DIE = dyn_cast<DesignatedInitExpr>(Arg)) {
6528 if (DIE->size() == 1 && DIE->getDesignator(0)->isFieldDesignator()) {
6529 DesignatedFieldName = DIE->getDesignator(0)->getFieldName();
6530 ArgsAfterDesignator = 0;
6534 }
else if (isa<DesignatedInitUpdateExpr>(Arg)) {
6537 ++ArgsAfterDesignator;
6540 if (!DesignatedFieldName)
6541 return std::nullopt;
6545 unsigned DesignatedIndex = 0;
6546 const FieldDecl *DesignatedField =
nullptr;
6547 for (
const auto *Field :
Aggregate.getAggregate()->fields()) {
6548 if (Field->getIdentifier() == DesignatedFieldName) {
6549 DesignatedField = Field;
6554 if (!DesignatedField)
6558 unsigned AggregateSize =
Aggregate.getNumParams();
6559 while (DesignatedIndex < AggregateSize &&
6560 Aggregate.getParamDecl(DesignatedIndex) != DesignatedField)
6564 return DesignatedIndex + ArgsAfterDesignator + 1;
6587 if (Braced && !RD->
isUnion() &&
6592 if (
auto NextIndex =
6595 if (*NextIndex >= AggregateSize)
6597 Results.push_back(AggregateSig);
6603 if (Args.size() < AggregateSize)
6604 Results.push_back(AggregateSig);
6614 if (
auto *FD = dyn_cast<FunctionDecl>(
C)) {
6617 if (Braced && getLangOpts().
CPlusPlus &&
6625 }
else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
C)) {
6626 if (Braced && getLangOpts().
CPlusPlus &&
6632 nullptr, Args, CandidateSet,
6653 dyn_cast<CXXConstructorDecl>(ConstructorDecl);
6658 Constructor->getParent(), SS, TemplateTypeTy, II))
6659 return ProduceConstructorSignatureHelp(MemberDecl->getType(),
6660 MemberDecl->getLocation(), ArgExprs,
6661 OpenParLoc, Braced);
6669 if (Index < Params.
size())
6672 Param = Params.
asArray().back();
6678 return llvm::isa<TemplateTypeParmDecl>(Param);
6680 return llvm::isa<NonTypeTemplateParmDecl>(Param);
6682 return llvm::isa<TemplateTemplateParmDecl>(Param);
6684 llvm_unreachable(
"Unhandled switch case");
6690 if (!CodeCompleter || !ParsedTemplate)
6696 bool Matches =
true;
6697 for (
unsigned I = 0; I < Args.size(); ++I) {
6704 Results.emplace_back(TD);
6708 if (
const auto *TD =
Template.getAsTemplateDecl()) {
6710 }
else if (
const auto *OTS =
Template.getAsOverloadedTemplate()) {
6712 if (
const auto *TD = llvm::dyn_cast<TemplateDecl>(ND))
6726 if (
D.isArrayDesignator() ||
D.isArrayRangeDesignator()) {
6730 assert(
D.isFieldDesignator());
6732 if (RD && RD->isCompleteDefinition()) {
6733 for (
const auto *
Member : RD->lookup(
D.getFieldDecl()))
6735 NextType = FD->getType();
6740 BaseType = NextType;
6751 if (!RD || RD->fields().empty())
6756 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6757 CodeCompleter->getCodeCompletionTUInfo(), CCC);
6759 Results.EnterNewScope();
6760 for (
const Decl *
D : RD->decls()) {
6762 if (
auto *IFD = dyn_cast<IndirectFieldDecl>(
D))
6763 FD = IFD->getAnonField();
6764 else if (
auto *DFD = dyn_cast<FieldDecl>(
D))
6774 Results.ExitScope();
6776 Results.getCompletionContext(), Results.data(),
6781 ValueDecl *VD = dyn_cast_or_null<ValueDecl>(
D);
6783 CodeCompleteOrdinaryName(S, PCC_Expression);
6790 Data.IgnoreDecls.push_back(VD);
6792 CodeCompleteExpression(S,
Data);
6796 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6797 CodeCompleter->getCodeCompletionTUInfo(),
6800 Results.getCodeCompletionTUInfo());
6802 if (!AfterExclaim) {
6803 if (Results.includeCodePatterns()) {
6804 Builder.AddTypedTextChunk(
"constexpr");
6807 Builder.AddPlaceholderChunk(
"condition");
6812 Builder.AddPlaceholderChunk(
"statements");
6815 Results.AddResult({Builder.TakeString()});
6817 Results.AddResult({
"constexpr"});
6822 if (Results.includeCodePatterns()) {
6823 Builder.AddTypedTextChunk(
"consteval");
6827 Builder.AddPlaceholderChunk(
"statements");
6830 Results.AddResult({Builder.TakeString()});
6832 Results.AddResult({
"consteval"});
6837 Results.getCompletionContext(), Results.data(),
6842 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6843 CodeCompleter->getCodeCompletionTUInfo(),
6845 Results.setFilter(&ResultBuilder::IsOrdinaryName);
6846 Results.EnterNewScope();
6848 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
6850 CodeCompleter->includeGlobals(),
6851 CodeCompleter->loadExternal());
6857 Results.getCodeCompletionTUInfo());
6859 auto AddElseBodyPattern = [&] {
6864 Builder.AddPlaceholderChunk(
"statements");
6870 Builder.AddPlaceholderChunk(
"statement");
6874 Builder.AddTypedTextChunk(
"else");
6875 if (Results.includeCodePatterns())
6876 AddElseBodyPattern();
6877 Results.AddResult(Builder.TakeString());
6880 Builder.AddTypedTextChunk(
"else if");
6884 Builder.AddPlaceholderChunk(
"condition");
6886 Builder.AddPlaceholderChunk(
"expression");
6888 if (Results.includeCodePatterns()) {
6889 AddElseBodyPattern();
6891 Results.AddResult(Builder.TakeString());
6893 Results.ExitScope();
6895 if (S->getFnParent())
6898 if (CodeCompleter->includeMacros())
6902 Results.getCompletionContext(), Results.data(),
6907 bool EnteringContext,
6908 bool IsUsingDeclaration,
6911 if (SS.
isEmpty() || !CodeCompleter)
6926 ResultBuilder DummyResults(SemaRef, CodeCompleter->getAllocator(),
6927 CodeCompleter->getCodeCompletionTUInfo(), CC);
6928 if (!PreferredType.
isNull())
6929 DummyResults.setPreferredType(PreferredType);
6930 if (S->getEntity()) {
6931 CodeCompletionDeclConsumer Consumer(DummyResults, S->getEntity(),
6938 DummyResults.getCompletionContext(),
nullptr, 0);
6953 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
6954 CodeCompleter->getCodeCompletionTUInfo(), CC);
6955 if (!PreferredType.
isNull())
6956 Results.setPreferredType(PreferredType);
6957 Results.EnterNewScope();
6963 Results.AddResult(
"template");
6968 if (
const auto *TTPT = dyn_cast<TemplateTypeParmType>(NNS.
getAsType())) {
6969 for (
const auto &R : ConceptInfo(*TTPT, S).members()) {
6970 if (R.Operator != ConceptInfo::Member::Colons)
6973 R.render(SemaRef, CodeCompleter->getAllocator(),
6974 CodeCompleter->getCodeCompletionTUInfo())));
6984 if (Ctx && !EnteringContext)
6986 Results.ExitScope();
6989 (CodeCompleter->includeNamespaceLevelDecls() || !Ctx->isFileContext())) {
6990 CodeCompletionDeclConsumer Consumer(Results, Ctx, BaseType);
6994 CodeCompleter->loadExternal());
6998 Results.getCompletionContext(), Results.data(),
7009 Context.setIsUsingDeclaration(
true);
7011 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7012 CodeCompleter->getCodeCompletionTUInfo(), Context,
7013 &ResultBuilder::IsNestedNameSpecifier);
7014 Results.EnterNewScope();
7017 if (!S->isClassScope())
7022 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
7024 CodeCompleter->includeGlobals(),
7025 CodeCompleter->loadExternal());
7026 Results.ExitScope();
7029 Results.getCompletionContext(), Results.data(),
7039 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7040 CodeCompleter->getCodeCompletionTUInfo(),
7042 &ResultBuilder::IsNamespaceOrAlias);
7043 Results.EnterNewScope();
7044 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
7046 CodeCompleter->includeGlobals(),
7047 CodeCompleter->loadExternal());
7048 Results.ExitScope();
7050 Results.getCompletionContext(), Results.data(),
7059 if (!S->getParent())
7062 bool SuppressedGlobalResults =
7063 Ctx && !CodeCompleter->includeGlobals() && isa<TranslationUnitDecl>(Ctx);
7065 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7066 CodeCompleter->getCodeCompletionTUInfo(),
7067 SuppressedGlobalResults
7070 &ResultBuilder::IsNamespace);
7072 if (Ctx && Ctx->isFileContext() && !SuppressedGlobalResults) {
7077 std::map<NamespaceDecl *, NamespaceDecl *> OrigToLatest;
7079 NS(Ctx->decls_begin()),
7080 NSEnd(Ctx->decls_end());
7082 OrigToLatest[NS->getFirstDecl()] = *NS;
7086 Results.EnterNewScope();
7087 for (std::map<NamespaceDecl *, NamespaceDecl *>::iterator
7088 NS = OrigToLatest.begin(),
7089 NSEnd = OrigToLatest.end();
7095 Results.ExitScope();
7099 Results.getCompletionContext(), Results.data(),
7108 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7109 CodeCompleter->getCodeCompletionTUInfo(),
7111 &ResultBuilder::IsNamespaceOrAlias);
7112 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
7114 CodeCompleter->includeGlobals(),
7115 CodeCompleter->loadExternal());
7117 Results.getCompletionContext(), Results.data(),
7126 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7127 CodeCompleter->getCodeCompletionTUInfo(),
7129 &ResultBuilder::IsType);
7130 Results.EnterNewScope();
7134#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
7135 if (OO_##Name != OO_Conditional) \
7136 Results.AddResult(Result(Spelling));
7137#include "clang/Basic/OperatorKinds.def"
7140 Results.allowNestedNameSpecifiers();
7141 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
7143 CodeCompleter->includeGlobals(),
7144 CodeCompleter->loadExternal());
7148 Results.ExitScope();
7151 Results.getCompletionContext(), Results.data(),
7162 auto *
Constructor = dyn_cast<CXXConstructorDecl>(ConstructorD);
7166 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7167 CodeCompleter->getCodeCompletionTUInfo(),
7169 Results.EnterNewScope();
7174 for (
unsigned I = 0,
E = Initializers.size(); I !=
E; ++I) {
7175 if (Initializers[I]->isBaseInitializer())
7176 InitializedBases.insert(getASTContext().getCanonicalType(
7177 QualType(Initializers[I]->getBaseClass(), 0)));
7179 InitializedFields.insert(
7180 cast<FieldDecl>(Initializers[I]->getAnyMember()));
7185 bool SawLastInitializer = Initializers.empty();
7188 auto GenerateCCS = [&](
const NamedDecl *ND,
const char *Name) {
7190 Results.getCodeCompletionTUInfo());
7191 Builder.AddTypedTextChunk(Name);
7193 if (
const auto *
Function = dyn_cast<FunctionDecl>(ND))
7195 else if (
const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
7197 FunTemplDecl->getTemplatedDecl(), Builder);
7199 return Builder.TakeString();
7201 auto AddDefaultCtorInit = [&](
const char *Name,
const char *
Type,
7204 Results.getCodeCompletionTUInfo());
7205 Builder.AddTypedTextChunk(Name);
7207 Builder.AddPlaceholderChunk(
Type);
7211 Builder.TakeString(), ND,
7213 if (isa<FieldDecl>(ND))
7215 return Results.AddResult(CCR);
7218 Builder.TakeString(),
7222 const char *Name,
const FieldDecl *FD) {
7224 return AddDefaultCtorInit(Name,
7225 FD ? Results.getAllocator().CopyString(
7226 FD->getType().getAsString(Policy))
7230 if (Ctors.begin() == Ctors.end())
7231 return AddDefaultCtorInit(Name, Name, RD);
7235 Results.AddResult(CCR);
7239 const char *BaseName =
7240 Results.getAllocator().CopyString(
Base.getType().getAsString(Policy));
7241 const auto *RD =
Base.getType()->getAsCXXRecordDecl();
7246 auto AddField = [&](
const FieldDecl *FD) {
7247 const char *FieldName =
7248 Results.getAllocator().CopyString(FD->getIdentifier()->getName());
7249 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl();
7255 for (
const auto &
Base : ClassDecl->
bases()) {
7256 if (!InitializedBases
7257 .insert(getASTContext().getCanonicalType(
Base.getType()))
7259 SawLastInitializer =
7260 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7261 getASTContext().hasSameUnqualifiedType(
7262 Base.getType(),
QualType(Initializers.back()->getBaseClass(), 0));
7267 SawLastInitializer =
false;
7271 for (
const auto &
Base : ClassDecl->
vbases()) {
7272 if (!InitializedBases
7273 .insert(getASTContext().getCanonicalType(
Base.getType()))
7275 SawLastInitializer =
7276 !Initializers.empty() && Initializers.back()->isBaseInitializer() &&
7277 getASTContext().hasSameUnqualifiedType(
7278 Base.getType(),
QualType(Initializers.back()->getBaseClass(), 0));
7283 SawLastInitializer =
false;
7287 for (
auto *Field : ClassDecl->
fields()) {
7288 if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
7290 SawLastInitializer = !Initializers.empty() &&
7291 Initializers.back()->isAnyMemberInitializer() &&
7292 Initializers.back()->getAnyMember() == Field;
7296 if (!Field->getDeclName())
7300 SawLastInitializer =
false;
7302 Results.ExitScope();
7305 Results.getCompletionContext(), Results.data(),
7320 bool AfterAmpersand) {
7321 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7322 CodeCompleter->getCodeCompletionTUInfo(),
7324 Results.EnterNewScope();
7328 bool IncludedThis =
false;
7331 IncludedThis =
true;
7340 for (
const auto *
D : S->decls()) {
7341 const auto *Var = dyn_cast<VarDecl>(
D);
7342 if (!Var || !Var->hasLocalStorage() || Var->hasAttr<BlocksAttr>())
7345 if (Known.insert(Var->getIdentifier()).second)
7355 Results.ExitScope();
7358 Results.getCompletionContext(), Results.data(),
7365 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7366 CodeCompleter->getCodeCompletionTUInfo(),
7368 auto ShouldAddDefault = [&
D,
this]() {
7369 if (!
D.isFunctionDeclarator())
7371 auto &
Id =
D.getName();
7377 D.getFunctionTypeInfo().NumParams <= 1)
7380 auto Op =
Id.OperatorFunctionId.Operator;
7383 if (Op == OverloadedOperatorKind::OO_Equal)
7385 if (getLangOpts().CPlusPlus20 &&
7386 (Op == OverloadedOperatorKind::OO_EqualEqual ||
7387 Op == OverloadedOperatorKind::OO_ExclaimEqual ||
7388 Op == OverloadedOperatorKind::OO_Less ||
7389 Op == OverloadedOperatorKind::OO_LessEqual ||
7390 Op == OverloadedOperatorKind::OO_Greater ||
7391 Op == OverloadedOperatorKind::OO_GreaterEqual ||
7392 Op == OverloadedOperatorKind::OO_Spaceship))
7398 Results.EnterNewScope();
7399 if (ShouldAddDefault())
7400 Results.AddResult(
"default");
7403 Results.AddResult(
"delete");
7404 Results.ExitScope();
7406 Results.getCompletionContext(), Results.data(),
7412#define OBJC_AT_KEYWORD_NAME(NeedAt, Keyword) ((NeedAt) ? "@" Keyword : Keyword)
7415 ResultBuilder &Results,
bool NeedAt) {
7421 Results.getCodeCompletionTUInfo());
7422 if (LangOpts.ObjC) {
7426 Builder.AddPlaceholderChunk(
"property");
7427 Results.AddResult(
Result(Builder.TakeString()));
7432 Builder.AddPlaceholderChunk(
"property");
7433 Results.AddResult(
Result(Builder.TakeString()));
7438 ResultBuilder &Results,
bool NeedAt) {
7444 if (LangOpts.ObjC) {
7459 Results.getCodeCompletionTUInfo());
7464 Builder.AddPlaceholderChunk(
"name");
7465 Results.AddResult(
Result(Builder.TakeString()));
7467 if (Results.includeCodePatterns()) {
7473 Builder.AddPlaceholderChunk(
"class");
7474 Results.AddResult(
Result(Builder.TakeString()));
7479 Builder.AddPlaceholderChunk(
"protocol");
7480 Results.AddResult(
Result(Builder.TakeString()));
7485 Builder.AddPlaceholderChunk(
"class");
7486 Results.AddResult(
Result(Builder.TakeString()));
7490 Builder.AddTypedTextChunk(
7493 Builder.AddPlaceholderChunk(
"alias");
7495 Builder.AddPlaceholderChunk(
"class");
7496 Results.AddResult(
Result(Builder.TakeString()));
7498 if (Results.getSema().getLangOpts().Modules) {
7502 Builder.AddPlaceholderChunk(
"module");
7503 Results.AddResult(
Result(Builder.TakeString()));
7508 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7509 CodeCompleter->getCodeCompletionTUInfo(),
7511 Results.EnterNewScope();
7518 Results.ExitScope();
7520 Results.getCompletionContext(), Results.data(),
7527 Results.getCodeCompletionTUInfo());
7530 const char *EncodeType =
"char[]";
7531 if (Results.getSema().getLangOpts().CPlusPlus ||
7532 Results.getSema().getLangOpts().ConstStrings)
7533 EncodeType =
"const char[]";
7534 Builder.AddResultTypeChunk(EncodeType);
7537 Builder.AddPlaceholderChunk(
"type-name");
7539 Results.AddResult(
Result(Builder.TakeString()));
7542 Builder.AddResultTypeChunk(
"Protocol *");
7545 Builder.AddPlaceholderChunk(
"protocol-name");
7547 Results.AddResult(
Result(Builder.TakeString()));
7550 Builder.AddResultTypeChunk(
"SEL");
7553 Builder.AddPlaceholderChunk(
"selector");
7555 Results.AddResult(
Result(Builder.TakeString()));
7558 Builder.AddResultTypeChunk(
"NSString *");
7560 Builder.AddPlaceholderChunk(
"string");
7561 Builder.AddTextChunk(
"\"");
7562 Results.AddResult(
Result(Builder.TakeString()));
7565 Builder.AddResultTypeChunk(
"NSArray *");
7567 Builder.AddPlaceholderChunk(
"objects, ...");
7569 Results.AddResult(
Result(Builder.TakeString()));
7572 Builder.AddResultTypeChunk(
"NSDictionary *");
7574 Builder.AddPlaceholderChunk(
"key");
7577 Builder.AddPlaceholderChunk(
"object, ...");
7579 Results.AddResult(
Result(Builder.TakeString()));
7582 Builder.AddResultTypeChunk(
"id");
7584 Builder.AddPlaceholderChunk(
"expression");
7586 Results.AddResult(
Result(Builder.TakeString()));
7592 Results.getCodeCompletionTUInfo());
7594 if (Results.includeCodePatterns()) {
7599 Builder.AddPlaceholderChunk(
"statements");
7601 Builder.AddTextChunk(
"@catch");
7603 Builder.AddPlaceholderChunk(
"parameter");
7606 Builder.AddPlaceholderChunk(
"statements");
7608 Builder.AddTextChunk(
"@finally");
7610 Builder.AddPlaceholderChunk(
"statements");
7612 Results.AddResult(
Result(Builder.TakeString()));
7618 Builder.AddPlaceholderChunk(
"expression");
7619 Results.AddResult(
Result(Builder.TakeString()));
7621 if (Results.includeCodePatterns()) {
7626 Builder.AddPlaceholderChunk(
"expression");
7629 Builder.AddPlaceholderChunk(
"statements");
7631 Results.AddResult(
Result(Builder.TakeString()));
7636 ResultBuilder &Results,
bool NeedAt) {
7646 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7647 CodeCompleter->getCodeCompletionTUInfo(),
7649 Results.EnterNewScope();
7651 Results.ExitScope();
7653 Results.getCompletionContext(), Results.data(),
7658 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7659 CodeCompleter->getCodeCompletionTUInfo(),
7661 Results.EnterNewScope();
7664 Results.ExitScope();
7666 Results.getCompletionContext(), Results.data(),
7671 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7672 CodeCompleter->getCodeCompletionTUInfo(),
7674 Results.EnterNewScope();
7676 Results.ExitScope();
7678 Results.getCompletionContext(), Results.data(),
7686 if (Attributes & NewFlag)
7689 Attributes |= NewFlag;
7697 unsigned AssignCopyRetMask =
7703 if (AssignCopyRetMask &&
7722 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7723 CodeCompleter->getCodeCompletionTUInfo(),
7725 Results.EnterNewScope();
7762 Results.getCodeCompletionTUInfo());
7771 Results.getCodeCompletionTUInfo());
7784 Results.ExitScope();
7786 Results.getCompletionContext(), Results.data(),
7800 bool AllowSameLength =
true) {
7801 unsigned NumSelIdents = SelIdents.size();
7814 if (!AllowSameLength && NumSelIdents && NumSelIdents == Sel.
getNumArgs())
7817 for (
unsigned I = 0; I != NumSelIdents; ++I)
7827 bool AllowSameLength =
true) {
7861 ResultBuilder &Results,
bool InOriginalClass =
true,
7862 bool IsRootClass =
false) {
7866 IsRootClass = IsRootClass || (IFace && !IFace->
getSuperClass());
7870 if (M->isInstanceMethod() == WantInstanceMethods ||
7871 (IsRootClass && !WantInstanceMethods)) {
7877 if (!Selectors.insert(M->getSelector()).second)
7881 Result(M, Results.getBasePriority(M), std::nullopt);
7882 R.StartParameter = SelIdents.size();
7883 R.AllParametersAreInformative = (WantKind !=
MK_Any);
7884 if (!InOriginalClass)
7886 Results.MaybeAddResult(R, CurContext);
7891 if (
const auto *Protocol = dyn_cast<ObjCProtocolDecl>(Container)) {
7892 if (Protocol->hasDefinition()) {
7894 Protocol->getReferencedProtocols();
7896 E = Protocols.
end();
7898 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7899 Selectors, AllowSameLength, Results,
false, IsRootClass);
7908 AddObjCMethods(I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7909 Selectors, AllowSameLength, Results,
false, IsRootClass);
7913 AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents,
7914 CurContext, Selectors, AllowSameLength, Results,
7915 InOriginalClass, IsRootClass);
7919 CatDecl->getReferencedProtocols();
7921 E = Protocols.
end();
7923 AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, CurContext,
7924 Selectors, AllowSameLength, Results,
false, IsRootClass);
7928 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7929 Selectors, AllowSameLength, Results, InOriginalClass,
7937 SelIdents, CurContext, Selectors, AllowSameLength, Results,
7942 AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, CurContext,
7943 Selectors, AllowSameLength, Results, InOriginalClass,
7950 dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.
CurContext);
7953 dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.
CurContext))
7961 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7962 CodeCompleter->getCodeCompletionTUInfo(),
7964 Results.EnterNewScope();
7970 Results.ExitScope();
7972 Results.getCompletionContext(), Results.data(),
7979 dyn_cast_or_null<ObjCInterfaceDecl>(SemaRef.
CurContext);
7982 dyn_cast_or_null<ObjCCategoryDecl>(SemaRef.
CurContext))
7990 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
7991 CodeCompleter->getCodeCompletionTUInfo(),
7993 Results.EnterNewScope();
8000 Results.ExitScope();
8002 Results.getCompletionContext(), Results.data(),
8008 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8009 CodeCompleter->getCodeCompletionTUInfo(),
8011 Results.EnterNewScope();
8014 bool AddedInOut =
false;
8017 Results.AddResult(
"in");
8018 Results.AddResult(
"inout");
8023 Results.AddResult(
"out");
8025 Results.AddResult(
"inout");
8030 Results.AddResult(
"bycopy");
8031 Results.AddResult(
"byref");
8032 Results.AddResult(
"oneway");
8035 Results.AddResult(
"nonnull");
8036 Results.AddResult(
"nullable");
8037 Results.AddResult(
"null_unspecified");
8047 Results.getCodeCompletionTUInfo(),
8049 Builder.AddTypedTextChunk(
"IBAction");
8051 Builder.AddPlaceholderChunk(
"selector");
8054 Builder.AddTextChunk(
"id");
8056 Builder.AddTextChunk(
"sender");
8067 Results.ExitScope();
8070 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
8071 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
8073 CodeCompleter->includeGlobals(),
8074 CodeCompleter->loadExternal());
8076 if (CodeCompleter->includeMacros())
8080 Results.getCompletionContext(), Results.data(),
8089 auto *Msg = dyn_cast_or_null<ObjCMessageExpr>(
E);
8107 switch (Msg->getReceiverKind()) {
8111 IFace = ObjType->getInterface();
8115 QualType T = Msg->getInstanceReceiver()->getType();
8117 IFace = Ptr->getInterfaceDecl();
8130 if (
Method->isInstanceMethod())
8131 return llvm::StringSwitch<ObjCInterfaceDecl *>(
Id->getName())
8132 .Case(
"retain", IFace)
8133 .Case(
"strong", IFace)
8134 .Case(
"autorelease", IFace)
8135 .Case(
"copy", IFace)
8136 .Case(
"copyWithZone", IFace)
8137 .Case(
"mutableCopy", IFace)
8138 .Case(
"mutableCopyWithZone", IFace)
8139 .Case(
"awakeFromCoder", IFace)
8140 .Case(
"replacementObjectFromCoder", IFace)
8141 .Case(
"class", IFace)
8142 .Case(
"classForCoder", IFace)
8143 .Case(
"superclass", Super)
8146 return llvm::StringSwitch<ObjCInterfaceDecl *>(
Id->getName())
8148 .Case(
"alloc", IFace)
8149 .Case(
"allocWithZone", IFace)
8150 .Case(
"class", IFace)
8151 .Case(
"superclass", Super)
8174 ResultBuilder &Results) {
8185 while ((
Class =
Class->getSuperClass()) && !SuperMethod) {
8192 for (
const auto *Cat :
Class->known_categories()) {
8193 if ((SuperMethod = Cat->getMethod(CurMethod->
getSelector(),
8211 CurP != CurPEnd; ++CurP, ++SuperP) {
8214 (*SuperP)->getType()))
8218 if (!(*CurP)->getIdentifier())
8224 Results.getCodeCompletionTUInfo());
8228 Results.getCompletionContext().getBaseType(), Builder);
8231 if (NeedSuperKeyword) {
8232 Builder.AddTypedTextChunk(
"super");
8238 if (NeedSuperKeyword)
8239 Builder.AddTextChunk(
8242 Builder.AddTypedTextChunk(
8246 for (
unsigned I = 0, N = Sel.
getNumArgs(); I != N; ++I, ++CurP) {
8247 if (I > SelIdents.size())
8250 if (I < SelIdents.size())
8251 Builder.AddInformativeChunk(
8253 else if (NeedSuperKeyword || I > SelIdents.size()) {
8254 Builder.AddTextChunk(
8256 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8257 (*CurP)->getIdentifier()->getName()));
8259 Builder.AddTypedTextChunk(
8261 Builder.AddPlaceholderChunk(Builder.getAllocator().CopyString(
8262 (*CurP)->getIdentifier()->getName()));
8274 ResultBuilder Results(
8275 SemaRef, CodeCompleter->getAllocator(),
8276 CodeCompleter->getCodeCompletionTUInfo(),
8279 ? &ResultBuilder::IsObjCMessageReceiverOrLambdaCapture
8280 : &ResultBuilder::IsObjCMessageReceiver);
8282 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
8283 Results.EnterNewScope();
8285 CodeCompleter->includeGlobals(),
8286 CodeCompleter->loadExternal());
8292 if (Iface->getSuperClass()) {
8293 Results.AddResult(
Result(
"super"));
8301 Results.ExitScope();
8303 if (CodeCompleter->includeMacros())
8306 Results.getCompletionContext(), Results.data(),
8316 CDecl = CurMethod->getClassInterface();
8325 if (CurMethod->isInstanceMethod()) {
8329 return CodeCompleteObjCInstanceMessage(S,
nullptr, SelIdents,
8330 AtArgumentExpression, CDecl);
8340 if ((CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(ND))) {
8342 }
else if (
TypeDecl *TD = dyn_cast_or_null<TypeDecl>(ND)) {
8344 getASTContext().getTypeDeclType(TD)->getAs<ObjCObjectType>())
8345 CDecl = Iface->getInterface();
8346 }
else if (ND && isa<UnresolvedUsingTypenameDecl>(ND)) {
8358 return CodeCompleteObjCInstanceMessage(S, (
Expr *)SuperExpr.
get(),
8359 SelIdents, AtArgumentExpression);
8368 return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,
8369 AtArgumentExpression,
8376 unsigned NumSelIdents) {
8378 ASTContext &Context = Results.getSema().Context;
8382 Result *ResultsData = Results.data();
8383 for (
unsigned I = 0, N = Results.size(); I != N; ++I) {
8384 Result &R = ResultsData[I];
8385 if (R.Kind == Result::RK_Declaration &&
8386 isa<ObjCMethodDecl>(R.Declaration)) {
8387 if (R.Priority <= BestPriority) {
8389 if (NumSelIdents <= Method->param_size()) {
8391 Method->parameters()[NumSelIdents - 1]->getType();
8392 if (R.Priority < BestPriority || PreferredType.
isNull()) {
8393 BestPriority = R.Priority;
8394 PreferredType = MyPreferredType;
8404 return PreferredType;
8410 bool AtArgumentExpression,
bool IsSuper,
8411 ResultBuilder &Results) {
8426 Results.EnterNewScope();
8433 Results.Ignore(SuperMethod);
8439 Results.setPreferredSelector(CurMethod->getSelector());
8444 Selectors, AtArgumentExpression, Results);
8451 for (uint32_t I = 0,
8462 for (SemaObjC::GlobalMethodPool::iterator
8467 MethList && MethList->
getMethod(); MethList = MethList->getNext()) {
8471 Result R(MethList->getMethod(),
8472 Results.getBasePriority(MethList->getMethod()),
8474 R.StartParameter = SelIdents.size();
8475 R.AllParametersAreInformative =
false;
8476 Results.MaybeAddResult(R, SemaRef.
CurContext);
8481 Results.ExitScope();
8486 bool AtArgumentExpression,
bool IsSuper) {
8490 ResultBuilder Results(
8491 SemaRef, CodeCompleter->getAllocator(),
8492 CodeCompleter->getCodeCompletionTUInfo(),
8497 AtArgumentExpression, IsSuper, Results);
8504 if (AtArgumentExpression) {
8507 if (PreferredType.
isNull())
8508 CodeCompleteOrdinaryName(S, PCC_Expression);
8510 CodeCompleteExpression(S, PreferredType);
8515 Results.getCompletionContext(), Results.data(),
8531 RecExpr = Conv.
get();
8545 return CodeCompleteObjCClassMessage(
8547 AtArgumentExpression, Super);
8552 }
else if (RecExpr && getLangOpts().
CPlusPlus) {
8555 RecExpr = Conv.
get();
8556 ReceiverType = RecExpr->
getType();
8561 ResultBuilder Results(
8562 SemaRef, CodeCompleter->getAllocator(),
8563 CodeCompleter->getCodeCompletionTUInfo(),
8565 ReceiverType, SelIdents));
8567 Results.EnterNewScope();
8574 Results.Ignore(SuperMethod);
8580 Results.setPreferredSelector(CurMethod->getSelector());
8593 Selectors, AtArgumentExpression, Results);
8600 for (
auto *I : QualID->quals())
8602 AtArgumentExpression, Results);
8609 SemaRef.
CurContext, Selectors, AtArgumentExpression,
8613 for (
auto *I : IFacePtr->quals())
8615 AtArgumentExpression, Results);
8625 for (uint32_t I = 0,
8636 for (SemaObjC::GlobalMethodPool::iterator
8641 MethList && MethList->
getMethod(); MethList = MethList->getNext()) {
8645 if (!Selectors.insert(MethList->getMethod()->getSelector()).second)
8648 Result R(MethList->getMethod(),
8649 Results.getBasePriority(MethList->getMethod()),
8651 R.StartParameter = SelIdents.size();
8652 R.AllParametersAreInformative =
false;
8653 Results.MaybeAddResult(R, SemaRef.
CurContext);
8657 Results.ExitScope();
8664 if (AtArgumentExpression) {
8667 if (PreferredType.
isNull())
8668 CodeCompleteOrdinaryName(S, PCC_Expression);
8670 CodeCompleteExpression(S, PreferredType);
8675 Results.getCompletionContext(), Results.data(),
8682 Data.ObjCCollection =
true;
8688 Data.IgnoreDecls.push_back(*I);
8692 CodeCompleteExpression(S,
Data);
8700 for (uint32_t I = 0, N = SemaRef.
ExternalSource->GetNumExternalSelectors();
8710 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8711 CodeCompleter->getCodeCompletionTUInfo(),
8713 Results.EnterNewScope();
8714 for (SemaObjC::GlobalMethodPool::iterator
8724 Results.getCodeCompletionTUInfo());
8726 Builder.AddTypedTextChunk(
8728 Results.AddResult(Builder.TakeString());
8732 std::string Accumulator;
8733 for (
unsigned I = 0, N = Sel.
getNumArgs(); I != N; ++I) {
8734 if (I == SelIdents.size()) {
8735 if (!Accumulator.empty()) {
8736 Builder.AddInformativeChunk(
8737 Builder.getAllocator().CopyString(Accumulator));
8738 Accumulator.clear();
8745 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(Accumulator));
8746 Results.AddResult(Builder.TakeString());
8748 Results.ExitScope();
8751 Results.getCompletionContext(), Results.data(),
8758 bool OnlyForwardDeclarations,
8759 ResultBuilder &Results) {
8762 for (
const auto *
D : Ctx->decls()) {
8764 if (
const auto *Proto = dyn_cast<ObjCProtocolDecl>(
D))
8765 if (!OnlyForwardDeclarations || !Proto->hasDefinition())
8766 Results.AddResult(
Result(Proto, Results.getBasePriority(Proto),
8768 CurContext,
nullptr,
false);
8774 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8775 CodeCompleter->getCodeCompletionTUInfo(),
8778 if (CodeCompleter->includeGlobals()) {
8779 Results.EnterNewScope();
8786 Pair.getIdentifierInfo(), Pair.getLoc()))
8787 Results.Ignore(Protocol);
8793 Results.ExitScope();
8797 Results.getCompletionContext(), Results.data(),
8802 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8803 CodeCompleter->getCodeCompletionTUInfo(),
8806 if (CodeCompleter->includeGlobals()) {
8807 Results.EnterNewScope();
8813 Results.ExitScope();
8817 Results.getCompletionContext(), Results.data(),
8824 bool OnlyForwardDeclarations,
8825 bool OnlyUnimplemented,
8826 ResultBuilder &Results) {
8829 for (
const auto *
D : Ctx->decls()) {
8831 if (
const auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
8832 if ((!OnlyForwardDeclarations || !
Class->hasDefinition()) &&
8833 (!OnlyUnimplemented || !
Class->getImplementation()))
8836 CurContext,
nullptr,
false);
8841 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8842 CodeCompleter->getCodeCompletionTUInfo(),
8844 Results.EnterNewScope();
8846 if (CodeCompleter->includeGlobals()) {
8852 Results.ExitScope();
8855 Results.getCompletionContext(), Results.data(),
8860 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8861 CodeCompleter->getCodeCompletionTUInfo(),
8863 Results.EnterNewScope();
8865 if (CodeCompleter->includeGlobals()) {
8871 Results.ExitScope();
8874 Results.getCompletionContext(), Results.data(),
8880 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8881 CodeCompleter->getCodeCompletionTUInfo(),
8883 Results.EnterNewScope();
8888 if (CurClass && isa<ObjCInterfaceDecl>(CurClass))
8889 Results.Ignore(CurClass);
8891 if (CodeCompleter->includeGlobals()) {
8897 Results.ExitScope();
8900 Results.getCompletionContext(), Results.data(),
8905 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8906 CodeCompleter->getCodeCompletionTUInfo(),
8908 Results.EnterNewScope();
8910 if (CodeCompleter->includeGlobals()) {
8916 Results.ExitScope();
8919 Results.getCompletionContext(), Results.data(),
8927 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8928 CodeCompleter->getCodeCompletionTUInfo(),
8937 dyn_cast_or_null<ObjCInterfaceDecl>(CurClass)) {
8938 for (
const auto *Cat :
Class->visible_categories())
8939 CategoryNames.insert(Cat->getIdentifier());
8943 Results.EnterNewScope();
8945 for (
const auto *
D : TU->
decls())
8946 if (
const auto *
Category = dyn_cast<ObjCCategoryDecl>(
D))
8947 if (CategoryNames.insert(
Category->getIdentifier()).second)
8951 Results.ExitScope();
8954 Results.getCompletionContext(), Results.data(),
8969 return CodeCompleteObjCInterfaceCategory(S, ClassName, ClassNameLoc);
8971 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
8972 CodeCompleter->getCodeCompletionTUInfo(),
8979 Results.EnterNewScope();
8980 bool IgnoreImplemented =
true;
8982 for (
const auto *Cat :
Class->visible_categories()) {
8983 if ((!IgnoreImplemented || !Cat->getImplementation()) &&
8984 CategoryNames.insert(Cat->getIdentifier()).second)
8985 Results.AddResult(
Result(Cat, Results.getBasePriority(Cat),
8991 IgnoreImplemented =
false;
8993 Results.ExitScope();
8996 Results.getCompletionContext(), Results.data(),
9002 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9003 CodeCompleter->getCodeCompletionTUInfo(), CCContext);
9007 dyn_cast_or_null<ObjCContainerDecl>(SemaRef.
CurContext);
9008 if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
9009 !isa<ObjCCategoryImplDecl>(Container)))
9014 for (
const auto *
D : Container->decls())
9015 if (
const auto *PropertyImpl = dyn_cast<ObjCPropertyImplDecl>(
D))
9016 Results.Ignore(PropertyImpl->getPropertyDecl());
9020 Results.EnterNewScope();
9022 dyn_cast<ObjCImplementationDecl>(Container))
9025 AddedProperties, Results);
9028 cast<ObjCCategoryImplDecl>(Container)->getCategoryDecl(),
9030 AddedProperties, Results);
9031 Results.ExitScope();
9034 Results.getCompletionContext(), Results.data(),
9041 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9042 CodeCompleter->getCodeCompletionTUInfo(),
9047 dyn_cast_or_null<ObjCContainerDecl>(SemaRef.
CurContext);
9048 if (!Container || (!isa<ObjCImplementationDecl>(Container) &&
9049 !isa<ObjCCategoryImplDecl>(Container)))
9055 dyn_cast<ObjCImplementationDecl>(Container))
9056 Class = ClassImpl->getClassInterface();
9058 Class = cast<ObjCCategoryImplDecl>(Container)
9060 ->getClassInterface();
9063 QualType PropertyType = getASTContext().getObjCIdType();
9068 Property->getType().getNonReferenceType().getUnqualifiedType();
9071 Results.setPreferredType(PropertyType);
9076 Results.EnterNewScope();
9077 bool SawSimilarlyNamedIvar =
false;
9078 std::string NameWithPrefix;
9079 NameWithPrefix +=
'_';
9080 NameWithPrefix += PropertyName->getName();
9081 std::string NameWithSuffix = PropertyName->getName().str();
9082 NameWithSuffix +=
'_';
9085 Ivar = Ivar->getNextIvar()) {
9086 Results.AddResult(
Result(Ivar, Results.getBasePriority(Ivar),
9092 if ((PropertyName == Ivar->getIdentifier() ||
9093 NameWithPrefix == Ivar->getName() ||
9094 NameWithSuffix == Ivar->getName())) {
9095 SawSimilarlyNamedIvar =
true;
9099 if (Results.size() &&
9100 Results.data()[Results.size() - 1].Kind ==
9102 Results.data()[Results.size() - 1].Declaration == Ivar)
9103 Results.data()[Results.size() - 1].Priority--;
9108 if (!SawSimilarlyNamedIvar) {
9119 PropertyType, getASTContext(), Policy, Allocator));
9120 Builder.AddTypedTextChunk(Allocator.CopyString(NameWithPrefix));
9125 Results.ExitScope();
9128 Results.getCompletionContext(), Results.data(),
9135 llvm::PointerIntPair<ObjCMethodDecl *, 1, bool>>
9144 std::optional<bool> WantInstanceMethods,
9147 bool InOriginalClass =
true) {
9150 if (!IFace->hasDefinition())
9153 IFace = IFace->getDefinition();
9157 IFace->getReferencedProtocols();
9159 E = Protocols.
end();
9162 KnownMethods, InOriginalClass);
9165 for (
auto *Cat : IFace->visible_categories()) {
9167 KnownMethods,
false);
9171 if (IFace->getSuperClass())
9173 WantInstanceMethods, ReturnType, KnownMethods,
9180 Category->getReferencedProtocols();
9182 E = Protocols.
end();
9185 KnownMethods, InOriginalClass);
9188 if (InOriginalClass &&
Category->getClassInterface())
9190 WantInstanceMethods, ReturnType, KnownMethods,
9196 if (!Protocol->hasDefinition())
9198 Protocol = Protocol->getDefinition();
9199 Container = Protocol;
9203 Protocol->getReferencedProtocols();
9205 E = Protocols.
end();
9208 KnownMethods,
false);
9214 for (
auto *M : Container->methods()) {
9215 if (!WantInstanceMethods || M->isInstanceMethod() == *WantInstanceMethods) {
9216 if (!ReturnType.
isNull() &&
9220 KnownMethods[M->getSelector()] =
9221 KnownMethodsMap::mapped_type(M, InOriginalClass);
9235 Builder.AddTextChunk(Builder.getAllocator().CopyString(Quals));
9236 Builder.AddTextChunk(
9247 if (
Class->getIdentifier() &&
Class->getIdentifier()->getName() == Name)
9256 bool IsInstanceMethod,
9259 ResultBuilder &Results) {
9261 if (!PropName || PropName->
getLength() == 0)
9279 const char *CopiedKey;
9282 : Allocator(Allocator), Key(Key), CopiedKey(
nullptr) {}
9284 operator const char *() {
9288 return CopiedKey = Allocator.CopyString(Key);
9290 } Key(Allocator, PropName->
getName());
9293 std::string UpperKey = std::string(PropName->
getName());
9294 if (!UpperKey.empty())
9297 bool ReturnTypeMatchesProperty =
9301 bool ReturnTypeMatchesVoid = ReturnType.
isNull() || ReturnType->
isVoidType();
9304 if (IsInstanceMethod &&
9306 ReturnTypeMatchesProperty && !
Property->getGetterMethodDecl()) {
9311 Builder.AddTypedTextChunk(Key);
9318 if (IsInstanceMethod &&
9319 ((!ReturnType.
isNull() &&
9322 Property->getType()->isBooleanType())))) {
9323 std::string SelectorName = (Twine(
"is") + UpperKey).str();
9327 if (ReturnType.
isNull()) {
9329 Builder.AddTextChunk(
"BOOL");
9333 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->
getName()));
9340 if (IsInstanceMethod && ReturnTypeMatchesVoid &&
9341 !
Property->getSetterMethodDecl()) {
9342 std::string SelectorName = (Twine(
"set") + UpperKey).str();
9344 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9345 if (ReturnType.
isNull()) {
9347 Builder.AddTextChunk(
"void");
9351 Builder.AddTypedTextChunk(
9352 Allocator.CopyString(SelectorId->
getName() +
":"));
9355 Builder.AddTextChunk(Key);
9366 if (
const auto *ObjCPointer =
9391 if (IsInstanceMethod &&
9393 std::string SelectorName = (Twine(
"countOf") + UpperKey).str();
9397 if (ReturnType.
isNull()) {
9399 Builder.AddTextChunk(
"NSUInteger");
9403 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorId->
getName()));
9405 Result(Builder.TakeString(),
9406 std::min(IndexedGetterPriority, UnorderedGetterPriority),
9413 if (IsInstanceMethod &&
9415 std::string SelectorName = (Twine(
"objectIn") + UpperKey +
"AtIndex").str();
9417 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9418 if (ReturnType.
isNull()) {
9420 Builder.AddTextChunk(
"id");
9424 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9426 Builder.AddTextChunk(
"NSUInteger");
9428 Builder.AddTextChunk(
"index");
9429 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9435 if (IsInstanceMethod &&
9442 std::string SelectorName = (Twine(
Property->getName()) +
"AtIndexes").str();
9444 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9445 if (ReturnType.
isNull()) {
9447 Builder.AddTextChunk(
"NSArray *");
9451 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9453 Builder.AddTextChunk(
"NSIndexSet *");
9455 Builder.AddTextChunk(
"indexes");
9456 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9462 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9463 std::string SelectorName = (Twine(
"get") + UpperKey).str();
9467 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9468 if (ReturnType.
isNull()) {
9470 Builder.AddTextChunk(
"void");
9474 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9476 Builder.AddPlaceholderChunk(
"object-type");
9477 Builder.AddTextChunk(
" **");
9479 Builder.AddTextChunk(
"buffer");
9481 Builder.AddTypedTextChunk(
"range:");
9483 Builder.AddTextChunk(
"NSRange");
9485 Builder.AddTextChunk(
"inRange");
9486 Results.AddResult(
Result(Builder.TakeString(), IndexedGetterPriority,
9494 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9495 std::string SelectorName = (Twine(
"in") + UpperKey +
"AtIndex").str();
9499 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9500 if (ReturnType.
isNull()) {
9502 Builder.AddTextChunk(
"void");
9506 Builder.AddTypedTextChunk(
"insertObject:");
9508 Builder.AddPlaceholderChunk(
"object-type");
9509 Builder.AddTextChunk(
" *");
9511 Builder.AddTextChunk(
"object");
9513 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9515 Builder.AddPlaceholderChunk(
"NSUInteger");
9517 Builder.AddTextChunk(
"index");
9518 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9524 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9525 std::string SelectorName = (Twine(
"insert") + UpperKey).str();
9529 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9530 if (ReturnType.
isNull()) {
9532 Builder.AddTextChunk(
"void");
9536 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9538 Builder.AddTextChunk(
"NSArray *");
9540 Builder.AddTextChunk(
"array");
9542 Builder.AddTypedTextChunk(
"atIndexes:");
9544 Builder.AddPlaceholderChunk(
"NSIndexSet *");
9546 Builder.AddTextChunk(
"indexes");
9547 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9553 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9554 std::string SelectorName =
9555 (Twine(
"removeObjectFrom") + UpperKey +
"AtIndex").str();
9557 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9558 if (ReturnType.
isNull()) {
9560 Builder.AddTextChunk(
"void");
9564 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9566 Builder.AddTextChunk(
"NSUInteger");
9568 Builder.AddTextChunk(
"index");
9569 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9575 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9576 std::string SelectorName = (Twine(
"remove") + UpperKey +
"AtIndexes").str();
9578 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9579 if (ReturnType.
isNull()) {
9581 Builder.AddTextChunk(
"void");
9585 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9587 Builder.AddTextChunk(
"NSIndexSet *");
9589 Builder.AddTextChunk(
"indexes");
9590 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9596 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9597 std::string SelectorName =
9598 (Twine(
"replaceObjectIn") + UpperKey +
"AtIndex").str();
9602 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9603 if (ReturnType.
isNull()) {
9605 Builder.AddTextChunk(
"void");
9609 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9611 Builder.AddPlaceholderChunk(
"NSUInteger");
9613 Builder.AddTextChunk(
"index");
9615 Builder.AddTypedTextChunk(
"withObject:");
9617 Builder.AddTextChunk(
"id");
9619 Builder.AddTextChunk(
"object");
9620 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9626 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9627 std::string SelectorName1 =
9628 (Twine(
"replace") + UpperKey +
"AtIndexes").str();
9629 std::string SelectorName2 = (Twine(
"with") + UpperKey).str();
9633 if (KnownSelectors.insert(Selectors.
getSelector(2, SelectorIds)).second) {
9634 if (ReturnType.
isNull()) {
9636 Builder.AddTextChunk(
"void");
9640 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName1 +
":"));
9642 Builder.AddPlaceholderChunk(
"NSIndexSet *");
9644 Builder.AddTextChunk(
"indexes");
9646 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName2 +
":"));
9648 Builder.AddTextChunk(
"NSArray *");
9650 Builder.AddTextChunk(
"array");
9651 Results.AddResult(
Result(Builder.TakeString(), IndexedSetterPriority,
9658 if (IsInstanceMethod &&
9664 ->
getName() ==
"NSEnumerator"))) {
9665 std::string SelectorName = (Twine(
"enumeratorOf") + UpperKey).str();
9669 if (ReturnType.
isNull()) {
9671 Builder.AddTextChunk(
"NSEnumerator *");
9675 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9676 Results.AddResult(
Result(Builder.TakeString(), UnorderedGetterPriority,
9682 if (IsInstanceMethod &&
9684 std::string SelectorName = (Twine(
"memberOf") + UpperKey).str();
9686 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9687 if (ReturnType.
isNull()) {
9689 Builder.AddPlaceholderChunk(
"object-type");
9690 Builder.AddTextChunk(
" *");
9694 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9696 if (ReturnType.
isNull()) {
9697 Builder.AddPlaceholderChunk(
"object-type");
9698 Builder.AddTextChunk(
" *");
9701 ReturnType, Context, Policy, Builder.getAllocator()));
9704 Builder.AddTextChunk(
"object");
9705 Results.AddResult(
Result(Builder.TakeString(), UnorderedGetterPriority,
9712 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9713 std::string SelectorName =
9714 (Twine(
"add") + UpperKey + Twine(
"Object")).str();
9716 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9717 if (ReturnType.
isNull()) {
9719 Builder.AddTextChunk(
"void");
9723 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9725 Builder.AddPlaceholderChunk(
"object-type");
9726 Builder.AddTextChunk(
" *");
9728 Builder.AddTextChunk(
"object");
9729 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9735 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9736 std::string SelectorName = (Twine(
"add") + UpperKey).str();
9738 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9739 if (ReturnType.
isNull()) {
9741 Builder.AddTextChunk(
"void");
9745 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9747 Builder.AddTextChunk(
"NSSet *");
9749 Builder.AddTextChunk(
"objects");
9750 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9756 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9757 std::string SelectorName =
9758 (Twine(
"remove") + UpperKey + Twine(
"Object")).str();
9760 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9761 if (ReturnType.
isNull()) {
9763 Builder.AddTextChunk(
"void");
9767 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9769 Builder.AddPlaceholderChunk(
"object-type");
9770 Builder.AddTextChunk(
" *");
9772 Builder.AddTextChunk(
"object");
9773 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9779 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9780 std::string SelectorName = (Twine(
"remove") + UpperKey).str();
9782 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9783 if (ReturnType.
isNull()) {
9785 Builder.AddTextChunk(
"void");
9789 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9791 Builder.AddTextChunk(
"NSSet *");
9793 Builder.AddTextChunk(
"objects");
9794 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9800 if (IsInstanceMethod && ReturnTypeMatchesVoid) {
9801 std::string SelectorName = (Twine(
"intersect") + UpperKey).str();
9803 if (KnownSelectors.insert(Selectors.
getUnarySelector(SelectorId)).second) {
9804 if (ReturnType.
isNull()) {
9806 Builder.AddTextChunk(
"void");
9810 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName +
":"));
9812 Builder.AddTextChunk(
"NSSet *");
9814 Builder.AddTextChunk(
"objects");
9815 Results.AddResult(
Result(Builder.TakeString(), UnorderedSetterPriority,
9822 if (!IsInstanceMethod &&
9829 std::string SelectorName =
9830 (Twine(
"keyPathsForValuesAffecting") + UpperKey).str();
9834 if (ReturnType.
isNull()) {
9836 Builder.AddTextChunk(
"NSSet<NSString *> *");
9840 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9847 if (!IsInstanceMethod &&
9850 std::string SelectorName =
9851 (Twine(
"automaticallyNotifiesObserversOf") + UpperKey).str();
9855 if (ReturnType.
isNull()) {
9857 Builder.AddTextChunk(
"BOOL");
9861 Builder.AddTypedTextChunk(Allocator.CopyString(SelectorName));
9869 Scope *S, std::optional<bool> IsInstanceMethod,
ParsedType ReturnTy) {
9874 Decl *IDecl =
nullptr;
9881 bool IsInImplementation =
false;
9882 if (
Decl *
D = IDecl) {
9884 SearchDecl = Impl->getClassInterface();
9885 IsInImplementation =
true;
9887 dyn_cast<ObjCCategoryImplDecl>(
D)) {
9888 SearchDecl = CatImpl->getCategoryDecl();
9889 IsInImplementation =
true;
9891 SearchDecl = dyn_cast<ObjCContainerDecl>(
D);
9894 if (!SearchDecl && S) {
9896 SearchDecl = dyn_cast<ObjCContainerDecl>(DC);
9912 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
9913 CodeCompleter->getCodeCompletionTUInfo(),
9915 Results.EnterNewScope();
9917 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
9918 MEnd = KnownMethods.end();
9922 Results.getCodeCompletionTUInfo());
9925 if (!IsInstanceMethod) {
9926 Builder.AddTextChunk(
Method->isInstanceMethod() ?
"-" :
"+");
9932 if (ReturnType.
isNull()) {
9933 QualType ResTy =
Method->getSendResultType().stripObjCKindOfType(Context);
9943 Builder.AddTypedTextChunk(
9949 PEnd =
Method->param_end();
9950 P != PEnd; (
void)++
P, ++I) {
9953 Builder.AddTypedTextChunk(
9957 Builder.AddTypedTextChunk(
9965 ParamType = (*P)->getType();
9967 ParamType = (*P)->getOriginalType();
9972 Context, Policy, Builder);
9975 Builder.AddTextChunk(
9976 Builder.getAllocator().CopyString(
Id->getName()));
9980 if (
Method->isVariadic()) {
9981 if (
Method->param_size() > 0)
9983 Builder.AddTextChunk(
"...");
9986 if (IsInImplementation && Results.includeCodePatterns()) {
9991 if (!
Method->getReturnType()->isVoidType()) {
9993 Builder.AddTextChunk(
"return");
9995 Builder.AddPlaceholderChunk(
"expression");
9998 Builder.AddPlaceholderChunk(
"statements");
10006 if (!M->second.getInt())
10008 Results.AddResult(std::move(R));
10015 Containers.push_back(SearchDecl);
10018 for (KnownMethodsMap::iterator M = KnownMethods.begin(),
10019 MEnd = KnownMethods.end();
10021 KnownSelectors.insert(M->first);
10026 IFace =
Category->getClassInterface();
10031 if (IsInstanceMethod) {
10032 for (
unsigned I = 0, N = Containers.size(); I != N; ++I)
10033 for (
auto *
P : Containers[I]->instance_properties())
10035 KnownSelectors, Results);
10039 Results.ExitScope();
10042 Results.getCompletionContext(), Results.data(),
10047 Scope *S,
bool IsInstanceMethod,
bool AtParameterName,
ParsedType ReturnTy,
10052 for (uint32_t I = 0, N = SemaRef.
ExternalSource->GetNumExternalSelectors();
10064 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10065 CodeCompleter->getCodeCompletionTUInfo(),
10069 Results.setPreferredType(
10072 Results.EnterNewScope();
10073 for (SemaObjC::GlobalMethodPool::iterator
10077 for (
ObjCMethodList *MethList = IsInstanceMethod ? &M->second.first
10078 : &M->second.second;
10079 MethList && MethList->getMethod(); MethList = MethList->getNext()) {
10083 if (AtParameterName) {
10085 unsigned NumSelIdents = SelIdents.size();
10086 if (NumSelIdents &&
10087 NumSelIdents <= MethList->getMethod()->param_size()) {
10089 MethList->getMethod()->parameters()[NumSelIdents - 1];
10092 Results.getCodeCompletionTUInfo());
10093 Builder.AddTypedTextChunk(Builder.getAllocator().CopyString(
10095 Results.AddResult(Builder.TakeString());
10102 Result R(MethList->getMethod(),
10103 Results.getBasePriority(MethList->getMethod()),
10105 R.StartParameter = SelIdents.size();
10106 R.AllParametersAreInformative =
false;
10107 R.DeclaringEntity =
true;
10108 Results.MaybeAddResult(R, SemaRef.
CurContext);
10112 Results.ExitScope();
10114 if (!AtParameterName && !SelIdents.empty() &&
10115 SelIdents.front()->getName().starts_with(
"init")) {
10116 for (
const auto &M : SemaRef.
PP.
macros()) {
10117 if (M.first->getName() !=
"NS_DESIGNATED_INITIALIZER")
10119 Results.EnterNewScope();
10121 Results.getCodeCompletionTUInfo());
10122 Builder.AddTypedTextChunk(
10123 Builder.getAllocator().CopyString(M.first->getName()));
10126 Results.ExitScope();
10131 Results.getCompletionContext(), Results.data(),
10136 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10137 CodeCompleter->getCodeCompletionTUInfo(),
10139 Results.EnterNewScope();
10143 Results.getCodeCompletionTUInfo());
10144 Builder.AddTypedTextChunk(
"if");
10146 Builder.AddPlaceholderChunk(
"condition");
10147 Results.AddResult(Builder.TakeString());
10150 Builder.AddTypedTextChunk(
"ifdef");
10152 Builder.AddPlaceholderChunk(
"macro");
10153 Results.AddResult(Builder.TakeString());
10156 Builder.AddTypedTextChunk(
"ifndef");
10158 Builder.AddPlaceholderChunk(
"macro");
10159 Results.AddResult(Builder.TakeString());
10161 if (InConditional) {
10163 Builder.AddTypedTextChunk(
"elif");
10165 Builder.AddPlaceholderChunk(
"condition");
10166 Results.AddResult(Builder.TakeString());
10169 Builder.AddTypedTextChunk(
"elifdef");
10171 Builder.AddPlaceholderChunk(
"macro");
10172 Results.AddResult(Builder.TakeString());
10175 Builder.AddTypedTextChunk(
"elifndef");
10177 Builder.AddPlaceholderChunk(
"macro");
10178 Results.AddResult(Builder.TakeString());
10181 Builder.AddTypedTextChunk(
"else");
10182 Results.AddResult(Builder.TakeString());
10185 Builder.AddTypedTextChunk(
"endif");
10186 Results.AddResult(Builder.TakeString());
10190 Builder.AddTypedTextChunk(
"include");
10192 Builder.AddTextChunk(
"\"");
10193 Builder.AddPlaceholderChunk(
"header");
10194 Builder.AddTextChunk(
"\"");
10195 Results.AddResult(Builder.TakeString());
10198 Builder.AddTypedTextChunk(
"include");
10200 Builder.AddTextChunk(
"<");
10201 Builder.AddPlaceholderChunk(
"header");
10202 Builder.AddTextChunk(
">");
10203 Results.AddResult(Builder.TakeString());
10206 Builder.AddTypedTextChunk(
"define");
10208 Builder.AddPlaceholderChunk(
"macro");
10209 Results.AddResult(Builder.TakeString());
10212 Builder.AddTypedTextChunk(
"define");
10214 Builder.AddPlaceholderChunk(
"macro");
10216 Builder.AddPlaceholderChunk(
"args");
10218 Results.AddResult(Builder.TakeString());
10221 Builder.AddTypedTextChunk(
"undef");
10223 Builder.AddPlaceholderChunk(
"macro");
10224 Results.AddResult(Builder.TakeString());
10227 Builder.AddTypedTextChunk(
"line");
10229 Builder.AddPlaceholderChunk(
"number");
10230 Results.AddResult(Builder.TakeString());
10233 Builder.AddTypedTextChunk(
"line");
10235 Builder.AddPlaceholderChunk(
"number");
10237 Builder.AddTextChunk(
"\"");
10238 Builder.AddPlaceholderChunk(
"filename");
10239 Builder.AddTextChunk(
"\"");
10240 Results.AddResult(Builder.TakeString());
10243 Builder.AddTypedTextChunk(
"error");
10245 Builder.AddPlaceholderChunk(
"message");
10246 Results.AddResult(Builder.TakeString());
10249 Builder.AddTypedTextChunk(
"pragma");
10251 Builder.AddPlaceholderChunk(
"arguments");
10252 Results.AddResult(Builder.TakeString());
10254 if (getLangOpts().
ObjC) {
10256 Builder.AddTypedTextChunk(
"import");
10258 Builder.AddTextChunk(
"\"");
10259 Builder.AddPlaceholderChunk(
"header");
10260 Builder.AddTextChunk(
"\"");
10261 Results.AddResult(Builder.TakeString());
10264 Builder.AddTypedTextChunk(
"import");
10266 Builder.AddTextChunk(
"<");
10267 Builder.AddPlaceholderChunk(
"header");
10268 Builder.AddTextChunk(
">");
10269 Results.AddResult(Builder.TakeString());
10273 Builder.AddTypedTextChunk(
"include_next");
10275 Builder.AddTextChunk(
"\"");
10276 Builder.AddPlaceholderChunk(
"header");
10277 Builder.AddTextChunk(
"\"");
10278 Results.AddResult(Builder.TakeString());
10281 Builder.AddTypedTextChunk(
"include_next");
10283 Builder.AddTextChunk(
"<");
10284 Builder.AddPlaceholderChunk(
"header");
10285 Builder.AddTextChunk(
">");
10286 Results.AddResult(Builder.TakeString());
10289 Builder.AddTypedTextChunk(
"warning");
10291 Builder.AddPlaceholderChunk(
"message");
10292 Results.AddResult(Builder.TakeString());
10299 Results.ExitScope();
10302 Results.getCompletionContext(), Results.data(),
10308 CodeCompleteOrdinaryName(S, S->getFnParent()
10314 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10315 CodeCompleter->getCodeCompletionTUInfo(),
10318 if (!IsDefinition && CodeCompleter->includeMacros()) {
10321 Results.getCodeCompletionTUInfo());
10322 Results.EnterNewScope();
10326 Builder.AddTypedTextChunk(
10327 Builder.getAllocator().CopyString(M->first->getName()));
10331 Results.ExitScope();
10332 }
else if (IsDefinition) {
10337 Results.getCompletionContext(), Results.data(),
10342 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10343 CodeCompleter->getCodeCompletionTUInfo(),
10346 if (CodeCompleter->includeMacros())
10350 Results.EnterNewScope();
10352 Results.getCodeCompletionTUInfo());
10353 Builder.AddTypedTextChunk(
"defined");
10356 Builder.AddPlaceholderChunk(
"macro");
10358 Results.AddResult(Builder.TakeString());
10359 Results.ExitScope();
10362 Results.getCompletionContext(), Results.data(),
10382 std::string RelDir = llvm::sys::path::convert_to_slash(Dir);
10385 llvm::sys::path::native(NativeRelDir);
10386 llvm::vfs::FileSystem &FS =
10389 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10390 CodeCompleter->getCodeCompletionTUInfo(),
10392 llvm::DenseSet<StringRef> SeenResults;
10395 auto AddCompletion = [&](StringRef
Filename,
bool IsDirectory) {
10398 TypedChunk.push_back(IsDirectory ?
'/' : Angled ?
'>' :
'"');
10399 auto R = SeenResults.insert(TypedChunk);
10401 const char *InternedTyped = Results.getAllocator().CopyString(TypedChunk);
10402 *R.first = InternedTyped;
10404 CodeCompleter->getCodeCompletionTUInfo());
10405 Builder.AddTypedTextChunk(InternedTyped);
10413 auto AddFilesFromIncludeDir = [&](StringRef IncludeDir,
10417 if (!NativeRelDir.empty()) {
10421 auto Begin = llvm::sys::path::begin(NativeRelDir);
10422 auto End = llvm::sys::path::end(NativeRelDir);
10424 llvm::sys::path::append(Dir, *
Begin +
".framework",
"Headers");
10425 llvm::sys::path::append(Dir, ++
Begin, End);
10427 llvm::sys::path::append(Dir, NativeRelDir);
10431 const StringRef &Dirname = llvm::sys::path::filename(Dir);
10432 const bool isQt = Dirname.starts_with(
"Qt") || Dirname ==
"ActiveQt";
10433 const bool ExtensionlessHeaders =
10434 IsSystem || isQt || Dir.ends_with(
".framework/Headers");
10435 std::error_code EC;
10436 unsigned Count = 0;
10437 for (
auto It = FS.dir_begin(Dir, EC);
10438 !EC && It != llvm::vfs::directory_iterator(); It.increment(EC)) {
10439 if (++Count == 2500)
10441 StringRef
Filename = llvm::sys::path::filename(It->path());
10446 llvm::sys::fs::file_type
Type = It->type();
10447 if (
Type == llvm::sys::fs::file_type::symlink_file) {
10448 if (
auto FileStatus = FS.status(It->path()))
10449 Type = FileStatus->getType();
10452 case llvm::sys::fs::file_type::directory_file:
10456 NativeRelDir.empty() && !
Filename.consume_back(
".framework"))
10461 case llvm::sys::fs::file_type::regular_file: {
10463 const bool IsHeader =
Filename.ends_with_insensitive(
".h") ||
10464 Filename.ends_with_insensitive(
".hh") ||
10465 Filename.ends_with_insensitive(
".hpp") ||
10466 Filename.ends_with_insensitive(
".hxx") ||
10467 Filename.ends_with_insensitive(
".inc") ||
10468 (ExtensionlessHeaders && !
Filename.contains(
'.'));
10483 switch (IncludeDir.getLookupType()) {
10488 AddFilesFromIncludeDir(IncludeDir.getDirRef()->getName(), IsSystem,
10492 AddFilesFromIncludeDir(IncludeDir.getFrameworkDirRef()->getName(),
10502 using llvm::make_range;
10506 AddFilesFromIncludeDir(CurFile->getDir().getName(),
false,
10508 for (
const auto &
D : make_range(S.quoted_dir_begin(), S.quoted_dir_end()))
10509 AddFilesFromDirLookup(
D,
false);
10511 for (
const auto &
D : make_range(S.angled_dir_begin(), S.angled_dir_end()))
10512 AddFilesFromDirLookup(
D,
false);
10513 for (
const auto &
D : make_range(S.system_dir_begin(), S.system_dir_end()))
10514 AddFilesFromDirLookup(
D,
true);
10517 Results.getCompletionContext(), Results.data(),
10528 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
10529 CodeCompleter->getCodeCompletionTUInfo(),
10531 Results.EnterNewScope();
10532 static const char *Platforms[] = {
"macOS",
"iOS",
"watchOS",
"tvOS"};
10536 Twine(Platform) +
"ApplicationExtension")));
10538 Results.ExitScope();
10540 Results.getCompletionContext(), Results.data(),
10547 ResultBuilder Builder(SemaRef, Allocator, CCTUInfo,
10549 if (!CodeCompleter || CodeCompleter->includeGlobals()) {
10550 CodeCompletionDeclConsumer Consumer(
10551 Builder, getASTContext().getTranslationUnitDecl());
10554 !CodeCompleter || CodeCompleter->loadExternal());
10557 if (!CodeCompleter || CodeCompleter->includeMacros())
10559 !CodeCompleter || CodeCompleter->loadExternal(),
true);
10562 Results.insert(Results.end(), Builder.data(),
10563 Builder.data() + Builder.size());
10568 :
SemaBase(S), CodeCompleter(CompletionConsumer),
10569 Resolver(S.getASTContext()) {}
This file provides AST data structures related to concepts.
llvm::DenseMap< const Stmt *, CFGBlock * > SMap
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
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.
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 AddTemplateParameterChunks(ASTContext &Context, const PrintingPolicy &Policy, const TemplateDecl *Template, CodeCompletionBuilder &Result, unsigned MaxParameters=0, unsigned Start=0, bool InDefaultArg=false)
Add template parameter chunks to the given code completion string.
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)
static void AddFunctionParameterChunks(Preprocessor &PP, const PrintingPolicy &Policy, const FunctionDecl *Function, CodeCompletionBuilder &Result, unsigned Start=0, bool InOptional=false)
Add function parameter chunks to the given code completion string.
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 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 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 AddFunctionTypeQuals(CodeCompletionBuilder &Result, const Qualifiers Quals)
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 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 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 AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, const FunctionDecl *Function)
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 QualType getDesignatedType(QualType BaseType, const Designation &Desig, HeuristicResolver &Resolver)
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.
enum clang::format::@1435::AnnotatingParser::Context::@359 ContextType
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 ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
DeclarationNameTable DeclarationNames
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
SelectorTable & Selectors
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 getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const
Return the documentation comment attached to a given declaration.
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getTagType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TagDecl *TD, bool OwnsTag) const
CanQualType getCanonicalTagType(const TagDecl *TD) const
QualType getElementType() const
Syntax
The style used to specify an attribute.
Type source information for an attributed type.
static std::optional< NullabilityKind > stripOuterNullability(QualType &T)
Strip off the top-level nullability annotation on the given type, if it's there.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
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.
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Represents a static or instance method of a struct/union/class.
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.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CaseStmt - Represent a case statement.
Represents a character-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 includeCodePatterns() const
Whether the code-completion consumer wants to see code patterns.
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 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, function or 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)
void addVisitedContext(DeclContext *Ctx)
Adds a visited context.
Captures a result of code completion.
bool DeclaringEntity
Whether we're completing a declaration of the given entity, rather than a use of that entity.
ResultKind Kind
The kind of result stored here.
const char * Keyword
When Kind == RK_Keyword, the string representing the keyword or symbol's spelling.
CXAvailabilityKind Availability
The availability of this result.
CodeCompletionString * CreateCodeCompletionString(Sema &S, const CodeCompletionContext &CCContext, CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo, bool IncludeBriefComments)
Create a new code-completion string that describes how to insert this result into a program.
bool QualifierIsInformative
Whether this result was found via lookup into a base class.
NestedNameSpecifier Qualifier
If the result should have a nested-name-specifier, this is it.
const NamedDecl * Declaration
When Kind == RK_Declaration or RK_Pattern, the declaration we are referring to.
CodeCompletionString * createCodeCompletionStringForDecl(Preprocessor &PP, ASTContext &Ctx, CodeCompletionBuilder &Result, bool IncludeBriefComments, const CodeCompletionContext &CCContext, PrintingPolicy &Policy)
CodeCompletionString * CreateCodeCompletionStringForMacro(Preprocessor &PP, CodeCompletionAllocator &Allocator, CodeCompletionTUInfo &CCTUInfo)
Creates a new code-completion string for the macro result.
unsigned StartParameter
Specifies which parameter (of a function, Objective-C method, macro, etc.) we should start with when ...
bool InBaseClass
Whether this is a class member from base class.
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 ('<').
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
const TypeClass * getTypePtr() const
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
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
bool isObjCContainer() const
ASTContext & getParentASTContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
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.
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
TranslationUnitDecl * getTranslationUnitDecl()
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) 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
@ CXXConversionFunctionName
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.
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
Represents a qualified type name for which the type name is dependent.
NestedNameSpecifier getQualifier() const
Retrieve the qualification on this type.
const IdentifierInfo * getIdentifier() const
Retrieve the identifier that terminates this type name.
A qualified reference to a name whose declaration cannot yet be resolved.
Designation - Represent a full designation, which is a sequence of designators.
const Designator & getDesignator(unsigned Idx) const
unsigned getNumDesignators() const
DirectoryLookup - This class represents one entry in the search list that specifies the search order ...
Recursive AST visitor that supports extension via dynamic dispatch.
virtual bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Recursively visit a C++ nested-name-specifier with location information.
This represents one expression.
static QualType findBoundMemberType(const Expr *expr)
Given an expression of bound-member type, find the type of the member.
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.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
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.
llvm::vfs::FileSystem & getVirtualFileSystem() const
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.
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
const QualType getPointeeType(QualType T) const
QualType simplifyType(QualType Type, const Expr *E, bool UnwrapPointer)
std::vector< const NamedDecl * > resolveMemberExpr(const CXXDependentScopeMemberExpr *ME) const
FunctionProtoTypeLoc getFunctionProtoTypeLoc(const Expr *Fn) const
TagDecl * resolveTypeToTagDecl(QualType T) const
std::vector< const NamedDecl * > resolveDependentNameType(const DependentNameType *DNT) 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.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
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.
const UnresolvedSetImpl & asUnresolvedSet() const
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this 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.
virtual ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective)=0
Attempt to load the given module.
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.
A C++ nested-name-specifier augmented with source location information.
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.
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 a class type in Objective C.
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.
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
bool isExplicitObjectParameter() const
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
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.
OptionalFileEntryRef getFileEntry() const
getFileEntry - Return the FileEntry corresponding to this FileID.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
macro_iterator macro_begin(bool IncludeExternalMacros=true) const
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with this preprocessor.
macro_iterator macro_end(bool IncludeExternalMacros=true) const
SourceManager & getSourceManager() const
MacroDefinition getMacroDefinition(const IdentifierInfo *II)
bool isMacroDefined(StringRef Id)
MacroMap::const_iterator macro_iterator
llvm::iterator_range< macro_iterator > macros(bool IncludeExternalMacros=true) const
PreprocessorLexer * getCurrentFileLexer() const
Return the current file lexer being lexed from.
HeaderSearch & getHeaderSearchInfo() const
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.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this 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 getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
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.
@ 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
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 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 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)
void CodeCompleteExpression(Scope *S, const CodeCompleteExpressionData &Data)
Perform code-completion in an expression context when we know what type we're looking for.
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 CodeCompleteQualifiedId(Scope *S, CXXScopeSpec &SS, bool EnteringContext, bool IsUsingDeclaration, QualType BaseType, QualType PreferredType)
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)
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 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)
ObjCInterfaceDecl * getObjCInterfaceDecl(const IdentifierInfo *&Id, SourceLocation IdLoc, bool TypoCorrection=false)
Look for an Objective-C class in the translation unit.
ObjCProtocolDecl * LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Find the protocol with the given name, if any.
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.
ExprResult PerformContextuallyConvertToObjCPointer(Expr *From)
PerformContextuallyConvertToObjCPointer - Perform a contextual conversion of the expression From to a...
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.
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
ExprResult ActOnIdExpression(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, UnqualifiedId &Id, bool HasTrailingLParen, bool IsAddressOfOperand, CorrectionCandidateCallback *CCC=nullptr, bool IsInlineAsmIdentifier=false, Token *KeywordReplacement=nullptr)
Preprocessor & getPreprocessor() const
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
IdentifierInfo * getSuperIdentifier() const
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
static bool TooManyArguments(size_t NumParams, size_t NumArgs, bool PartialOverloading=false)
To be used for checking whether the arguments being passed to function exceeds the number of paramete...
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ASTContext & getASTContext() const
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
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...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
const LangOptions & getLangOpts() const
void LookupVisibleDecls(Scope *S, LookupNameKind Kind, VisibleDeclConsumer &Consumer, bool IncludeGlobalScope=true, bool LoadExternal=true)
SemaCodeCompletion & CodeCompletion()
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
sema::FunctionScopeInfo * getCurFunction() const
void AddOverloadedCallCandidates(UnresolvedLookupExpr *ULE, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool PartialOverloading=false)
Add the overload candidates named by callee and/or found by argument dependent lookup to the given ov...
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.
SourceManager & getSourceManager() const
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
ExternalSemaSource * getExternalSource() const
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
void AddFunctionCandidates(const UnresolvedSetImpl &Functions, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, bool SuppressUserConversions=false, bool PartialOverloading=false, bool FirstArgumentIsBase=false)
Add all of the function declarations in the given function set to the overload candidate set.
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...
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SourceManager & SourceMgr
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
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.
FileManager & getFileManager() const
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.
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)
bool hasParameterPack() const
Determine whether this template parameter list contains a parameter pack.
ArrayRef< NamedDecl * > asArray()
Represents a type template specialization; the template must be a class template, a type alias templa...
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.
TemplateTypeParmDecl * getDecl() const
The top declaration context.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) 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 isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isTemplateTypeParmType() const
bool isMemberPointerType() const
bool isObjCIdType() const
bool isObjCObjectType() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
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...
TypeClass getTypeClass() const
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...
A static requirement that can be used in a requires-expression to check properties of types and expre...
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.
CXCursorKind
Describes the kind of entity that a cursor refers to.
@ 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.
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.
TypeSpecifierType
Specifies the kind of type.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ 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.
@ 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.
@ IK_ConstructorName
A constructor name.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ 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....
@ 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.
@ 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.
SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T)
Determine the simplified type class of the given canonical type.
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.
const FunctionProtoType * T
@ 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.
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)
@ 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.
llvm::StringRef getAsString(SyncScope S)
@ 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.
@ 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
@ 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...
bool IntegralConstantExpression
SmallVector< Decl *, 4 > IgnoreDecls
CodeCompleteExpressionData(QualType PreferredType=QualType(), bool IsParenthesized=false)
Represents a complete lambda introducer.
SmallVector< LambdaCapture, 4 > Captures
LambdaCaptureDefault Default
a linked list of methods with the same selector name but different signatures.
ObjCMethodDecl * getMethod() const
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 AnonymousTagLocations
When printing an anonymous tag name, also print the location of that entity (e.g.,...
unsigned CleanUglifiedParameters
Whether to strip underscores when printing reserved parameter names.
unsigned SuppressStrongLifetime
When true, suppress printing of the __strong lifetime qualifier in ARC.
unsigned SuppressTemplateArgsInCXXConstructors
When true, suppresses printing template arguments in names of C++ constructors.