46#include "llvm/ADT/ArrayRef.h"
47#include "llvm/ADT/DenseSet.h"
48#include "llvm/ADT/SmallBitVector.h"
49#include "llvm/ADT/SmallPtrSet.h"
50#include "llvm/ADT/SmallString.h"
51#include "llvm/ADT/StringSwitch.h"
52#include "llvm/ADT/Twine.h"
53#include "llvm/ADT/iterator_range.h"
54#include "llvm/Support/Casting.h"
55#include "llvm/Support/Path.h"
56#include "llvm/Support/raw_ostream.h"
75 typedef bool (ResultBuilder::*LookupFilter)(
const NamedDecl *)
const;
81 std::vector<Result> Results;
88 typedef std::pair<const NamedDecl *, unsigned> DeclIndexPair;
93 class ShadowMapEntry {
98 llvm::PointerUnion<const NamedDecl *, DeclIndexPairVector *> DeclOrVector;
102 unsigned SingleDeclIndex = 0;
105 ShadowMapEntry() =
default;
106 ShadowMapEntry(
const ShadowMapEntry &) =
delete;
107 ShadowMapEntry(ShadowMapEntry &&Move) { *
this = std::move(Move); }
108 ShadowMapEntry &operator=(
const ShadowMapEntry &) =
delete;
109 ShadowMapEntry &operator=(ShadowMapEntry &&Move) {
110 SingleDeclIndex =
Move.SingleDeclIndex;
111 DeclOrVector =
Move.DeclOrVector;
112 Move.DeclOrVector =
nullptr;
117 if (DeclOrVector.isNull()) {
120 SingleDeclIndex = Index;
125 DeclOrVector.dyn_cast<
const NamedDecl *>()) {
128 DeclIndexPairVector *Vec =
new DeclIndexPairVector;
129 Vec->push_back(DeclIndexPair(PrevND, SingleDeclIndex));
134 cast<DeclIndexPairVector *>(DeclOrVector)
135 ->push_back(DeclIndexPair(ND, Index));
139 if (DeclIndexPairVector *Vec =
140 DeclOrVector.dyn_cast<DeclIndexPairVector *>()) {
148 iterator begin()
const;
149 iterator end()
const;
155 typedef llvm::DenseMap<DeclarationName, ShadowMapEntry> ShadowMap;
172 bool AllowNestedNameSpecifiers;
183 std::list<ShadowMap> ShadowMaps;
197 bool HasObjectTypeQualifiers;
209 void AdjustResultPriorityForDecl(Result &R);
211 void MaybeAddConstructorResults(Result R);
217 LookupFilter Filter =
nullptr)
218 : SemaRef(SemaRef), Allocator(Allocator), CCTUInfo(CCTUInfo),
220 HasObjectTypeQualifiers(
false), CompletionContext(CompletionContext),
221 ObjCImplementation(nullptr) {
224 switch (CompletionContext.
getKind()) {
232 if (Method->isInstanceMethod())
234 ObjCImplementation =
Interface->getImplementation();
247 bool includeCodePatterns()
const {
253 void setFilter(LookupFilter Filter) { this->Filter =
Filter; }
255 Result *data() {
return Results.empty() ? nullptr : &Results.front(); }
256 unsigned size()
const {
return Results.size(); }
257 bool empty()
const {
return Results.empty(); }
272 ObjectTypeQualifiers = Quals;
274 HasObjectTypeQualifiers =
true;
282 void setPreferredSelector(
Selector Sel) { PreferredSelector = Sel; }
287 return CompletionContext;
291 void allowNestedNameSpecifiers(
bool Allow =
true) {
292 AllowNestedNameSpecifiers = Allow;
297 Sema &getSema()
const {
return SemaRef; }
311 bool isInterestingDecl(
const NamedDecl *ND,
312 bool &AsNestedNameSpecifier)
const;
337 bool CheckHiddenResult(Result &R,
DeclContext *CurContext,
347 void MaybeAddResult(Result R,
DeclContext *CurContext =
nullptr);
364 bool InBaseClass,
QualType BaseExprType);
367 void AddResult(Result R);
370 void EnterNewScope();
389 bool IsOrdinaryName(
const NamedDecl *ND)
const;
390 bool IsOrdinaryNonTypeName(
const NamedDecl *ND)
const;
391 bool IsIntegralConstantValue(
const NamedDecl *ND)
const;
392 bool IsOrdinaryNonValueName(
const NamedDecl *ND)
const;
393 bool IsNestedNameSpecifier(
const NamedDecl *ND)
const;
395 bool IsClassOrStruct(
const NamedDecl *ND)
const;
397 bool IsNamespace(
const NamedDecl *ND)
const;
398 bool IsNamespaceOrAlias(
const NamedDecl *ND)
const;
400 bool IsMember(
const NamedDecl *ND)
const;
401 bool IsObjCIvar(
const NamedDecl *ND)
const;
402 bool IsObjCMessageReceiver(
const NamedDecl *ND)
const;
403 bool IsObjCMessageReceiverOrLambdaCapture(
const NamedDecl *ND)
const;
404 bool IsObjCCollection(
const NamedDecl *ND)
const;
405 bool IsImpossibleToSatisfy(
const NamedDecl *ND)
const;
415 ComputeType =
nullptr;
416 Type = BSI->ReturnType;
420 ComputeType =
nullptr;
423 }
else if (
const auto *Method = dyn_cast<ObjCMethodDecl>(S.
CurContext)) {
424 ComputeType =
nullptr;
425 Type = Method->getReturnType();
433 auto *VD = llvm::dyn_cast_or_null<ValueDecl>(
D);
434 ComputeType =
nullptr;
446 ComputeType =
nullptr;
455 this->ComputeType = ComputeType;
465 if (ExpectedLoc == LParLoc)
476 if (Op == tok::plus || Op == tok::plusequal || Op == tok::minusequal)
479 if (Op == tok::minus)
492 case tok::minusequal:
494 case tok::percentequal:
496 case tok::slashequal:
502 case tok::equalequal:
503 case tok::exclaimequal:
507 case tok::greaterequal:
511 case tok::greatergreater:
512 case tok::greatergreaterequal:
514 case tok::lesslessequal:
527 case tok::caretequal:
535 case tok::periodstar:
563 case tok::minusminus:
573 assert(
false &&
"unhandled unary op");
582 ComputeType =
nullptr;
589 if (!Enabled || !
Base)
592 if (ExpectedLoc !=
Base->getBeginLoc())
603 ComputeType =
nullptr;
612 ComputeType =
nullptr;
621 ComputeType =
nullptr;
629 ComputeType =
nullptr;
635 llvm::PointerUnion<const NamedDecl *, const DeclIndexPair *> DeclOrIterator;
636 unsigned SingleDeclIndex;
656 : DeclOrIterator(SingleDecl), SingleDeclIndex(Index) {}
659 : DeclOrIterator(Iterator), SingleDeclIndex(0) {}
662 if (isa<const NamedDecl *>(DeclOrIterator)) {
668 const DeclIndexPair *I = cast<const DeclIndexPair *>(DeclOrIterator);
684 return *cast<const DeclIndexPair *>(DeclOrIterator);
690 return X.DeclOrIterator.getOpaqueValue() ==
691 Y.DeclOrIterator.getOpaqueValue() &&
692 X.SingleDeclIndex == Y.SingleDeclIndex;
701ResultBuilder::ShadowMapEntry::begin()
const {
702 if (DeclOrVector.isNull())
706 return iterator(ND, SingleDeclIndex);
708 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->begin());
712ResultBuilder::ShadowMapEntry::end()
const {
713 if (isa<const NamedDecl *>(DeclOrVector) || DeclOrVector.isNull())
716 return iterator(cast<DeclIndexPairVector *>(DeclOrVector)->end());
737 for (
const DeclContext *CommonAncestor = TargetContext;
738 CommonAncestor && !CommonAncestor->
Encloses(CurContext);
739 CommonAncestor = CommonAncestor->getLookupParent()) {
740 if (CommonAncestor->isTransparentContext() ||
741 CommonAncestor->isFunctionOrMethod())
744 TargetParents.push_back(CommonAncestor);
748 while (!TargetParents.empty()) {
751 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(
Parent)) {
752 if (!Namespace->getIdentifier())
756 }
else if (
const auto *TD = dyn_cast<TagDecl>(
Parent))
787bool ResultBuilder::isInterestingDecl(
const NamedDecl *ND,
788 bool &AsNestedNameSpecifier)
const {
789 AsNestedNameSpecifier =
false;
804 if (isa<ClassTemplateSpecializationDecl>(ND) ||
805 isa<ClassTemplatePartialSpecializationDecl>(ND))
809 if (isa<UsingDecl>(ND))
815 if (Filter == &ResultBuilder::IsNestedNameSpecifier ||
816 (isa<NamespaceDecl>(ND) && Filter != &ResultBuilder::IsNamespace &&
817 Filter != &ResultBuilder::IsNamespaceOrAlias && Filter !=
nullptr))
818 AsNestedNameSpecifier =
true;
821 if (Filter && !(this->*Filter)(Named)) {
823 if (AllowNestedNameSpecifiers && SemaRef.
getLangOpts().CPlusPlus &&
824 IsNestedNameSpecifier(ND) &&
825 (Filter != &ResultBuilder::IsMember ||
826 (isa<CXXRecordDecl>(ND) &&
827 cast<CXXRecordDecl>(ND)->isInjectedClassName()))) {
828 AsNestedNameSpecifier =
true;
858 R.QualifierIsInformative =
false;
862 R.Declaration->getDeclContext());
871 switch (cast<BuiltinType>(
T)->
getKind()) {
872 case BuiltinType::Void:
875 case BuiltinType::NullPtr:
878 case BuiltinType::Overload:
879 case BuiltinType::Dependent:
882 case BuiltinType::ObjCId:
883 case BuiltinType::ObjCClass:
884 case BuiltinType::ObjCSel:
897 case Type::BlockPointer:
900 case Type::LValueReference:
901 case Type::RValueReference:
904 case Type::ConstantArray:
905 case Type::IncompleteArray:
906 case Type::VariableArray:
907 case Type::DependentSizedArray:
910 case Type::DependentSizedExtVector:
912 case Type::ExtVector:
915 case Type::FunctionProto:
916 case Type::FunctionNoProto:
925 case Type::ObjCObject:
926 case Type::ObjCInterface:
927 case Type::ObjCObjectPointer:
940 if (
const auto *
Type = dyn_cast<TypeDecl>(ND))
941 return C.getTypeDeclType(
Type);
942 if (
const auto *Iface = dyn_cast<ObjCInterfaceDecl>(ND))
943 return C.getObjCInterfaceType(Iface);
948 else if (
const auto *Method = dyn_cast<ObjCMethodDecl>(ND))
949 T = Method->getSendResultType();
950 else if (
const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND))
951 T =
C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext()));
952 else if (
const auto *
Property = dyn_cast<ObjCPropertyDecl>(ND))
954 else if (
const auto *
Value = dyn_cast<ValueDecl>(ND))
970 if (
Pointer->getPointeeType()->isFunctionType()) {
979 T =
Block->getPointeeType();
994unsigned ResultBuilder::getBasePriority(
const NamedDecl *ND) {
1002 if (
const auto *ImplicitParam = dyn_cast<ImplicitParamDecl>(ND))
1003 if (ImplicitParam->getIdentifier() &&
1004 ImplicitParam->getIdentifier()->isStr(
"_cmd"))
1011 if (DC->
isRecord() || isa<ObjCContainerDecl>(DC)) {
1013 if (isa<CXXDestructorDecl>(ND))
1025 if (isa<EnumConstantDecl>(ND))
1031 if ((isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND)) &&
1033 CompletionContext.
getKind() ==
1035 CompletionContext.
getKind() ==
1042void ResultBuilder::AdjustResultPriorityForDecl(
Result &R) {
1045 if (!PreferredSelector.
isNull())
1046 if (
const auto *Method = dyn_cast<ObjCMethodDecl>(R.Declaration))
1047 if (PreferredSelector == Method->getSelector())
1052 if (!PreferredType.
isNull()) {
1062 !(PreferredType->isEnumeralType() && TC->isEnumeralType()))
1074 return Record->lookup(ConstructorName);
1077void ResultBuilder::MaybeAddConstructorResults(
Result R) {
1078 if (!SemaRef.
getLangOpts().CPlusPlus || !R.Declaration ||
1085 Record = ClassTemplate->getTemplatedDecl();
1086 else if ((
Record = dyn_cast<CXXRecordDecl>(
D))) {
1088 if (isa<ClassTemplateSpecializationDecl>(
Record))
1100 R.Declaration = Ctor;
1102 Results.push_back(R);
1107 if (
const auto *Tmpl = dyn_cast<FunctionTemplateDecl>(ND))
1108 ND = Tmpl->getTemplatedDecl();
1109 return isa<CXXConstructorDecl>(ND);
1113 assert(!ShadowMaps.empty() &&
"Must enter into a results scope");
1115 if (R.Kind != Result::RK_Declaration) {
1117 Results.push_back(R);
1122 if (
const UsingShadowDecl *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1124 getBasePriority(
Using->getTargetDecl()),
1128 std::move(R.FixIts));
1130 MaybeAddResult(
Result, CurContext);
1137 bool AsNestedNameSpecifier =
false;
1138 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1145 ShadowMap &
SMap = ShadowMaps.back();
1146 ShadowMapEntry::iterator I, IEnd;
1147 ShadowMap::iterator NamePos =
SMap.find(R.Declaration->getDeclName());
1148 if (NamePos !=
SMap.end()) {
1149 I = NamePos->second.begin();
1150 IEnd = NamePos->second.end();
1153 for (; I != IEnd; ++I) {
1155 unsigned Index = I->second;
1158 Results[Index].Declaration = R.Declaration;
1168 std::list<ShadowMap>::iterator
SM, SMEnd = ShadowMaps.end();
1170 for (
SM = ShadowMaps.begin();
SM != SMEnd; ++
SM) {
1171 ShadowMapEntry::iterator I, IEnd;
1172 ShadowMap::iterator NamePos =
SM->find(R.Declaration->getDeclName());
1173 if (NamePos !=
SM->end()) {
1174 I = NamePos->second.begin();
1175 IEnd = NamePos->second.end();
1177 for (; I != IEnd; ++I) {
1179 if (I->first->hasTagIdentifierNamespace() &&
1187 I->first->getIdentifierNamespace() != IDNS)
1191 if (CheckHiddenResult(R, CurContext, I->first))
1199 if (!AllDeclsFound.insert(CanonDecl).second)
1204 if (AsNestedNameSpecifier) {
1205 R.StartsNestedNameSpecifier =
true;
1208 AdjustResultPriorityForDecl(R);
1211 if (R.QualifierIsInformative && !R.Qualifier &&
1212 !R.StartsNestedNameSpecifier) {
1213 const DeclContext *Ctx = R.Declaration->getDeclContext();
1214 if (
const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1217 else if (
const TagDecl *Tag = dyn_cast<TagDecl>(Ctx))
1219 SemaRef.
Context,
nullptr,
false,
1222 R.QualifierIsInformative =
false;
1227 SMap[R.Declaration->getDeclName()].Add(R.Declaration, Results.size());
1228 Results.push_back(R);
1230 if (!AsNestedNameSpecifier)
1231 MaybeAddConstructorResults(R);
1251 return OverloadCompare::BothViable;
1256 return OverloadCompare::BothViable;
1258 if (Candidate.
parameters()[I]->getType().getCanonicalType() !=
1259 Incumbent.
parameters()[I]->getType().getCanonicalType())
1260 return OverloadCompare::BothViable;
1263 return OverloadCompare::BothViable;
1268 if (CandidateRef != IncumbentRef) {
1275 return CandidateRef ==
RQ_RValue ? OverloadCompare::Dominates
1276 : OverloadCompare::Dominated;
1284 if (CandidateSuperset == IncumbentSuperset)
1285 return OverloadCompare::BothViable;
1286 return IncumbentSuperset ? OverloadCompare::Dominates
1287 : OverloadCompare::Dominated;
1290bool ResultBuilder::canCxxMethodBeCalled(
const CXXMethodDecl *Method,
1296 const auto *CurrentClassScope = [&]() ->
const CXXRecordDecl * {
1298 const auto *CtxMethod = llvm::dyn_cast<CXXMethodDecl>(Ctx);
1299 if (CtxMethod && !CtxMethod->getParent()->isLambda()) {
1300 return CtxMethod->getParent();
1307 bool FunctionCanBeCall =
1308 CurrentClassScope &&
1309 (CurrentClassScope == Method->
getParent() ||
1313 if (FunctionCanBeCall)
1318 BaseExprType.
isNull() ?
nullptr
1322 MaybeDerived == MaybeBase || MaybeDerived->
isDerivedFrom(MaybeBase);
1325 return FunctionCanBeCall;
1328bool ResultBuilder::canFunctionBeCalled(
const NamedDecl *ND,
1339 if (
const auto *FuncTmpl = dyn_cast<FunctionTemplateDecl>(ND)) {
1340 ND = FuncTmpl->getTemplatedDecl();
1342 const auto *Method = dyn_cast<CXXMethodDecl>(ND);
1343 if (Method && !Method->
isStatic()) {
1344 return canCxxMethodBeCalled(Method, BaseExprType);
1351 NamedDecl *Hiding,
bool InBaseClass =
false,
1353 if (R.Kind != Result::RK_Declaration) {
1355 Results.push_back(R);
1360 if (
const auto *Using = dyn_cast<UsingShadowDecl>(R.Declaration)) {
1362 getBasePriority(
Using->getTargetDecl()),
1366 std::move(R.FixIts));
1368 AddResult(
Result, CurContext, Hiding,
false,
1373 bool AsNestedNameSpecifier =
false;
1374 if (!isInterestingDecl(R.Declaration, AsNestedNameSpecifier))
1381 if (Hiding && CheckHiddenResult(R, CurContext, Hiding))
1385 if (!AllDeclsFound.insert(R.Declaration->getCanonicalDecl()).second)
1390 if (AsNestedNameSpecifier) {
1391 R.StartsNestedNameSpecifier =
true;
1393 }
else if (Filter == &ResultBuilder::IsMember && !R.Qualifier &&
1396 R.Declaration->getDeclContext()->getRedeclContext()))
1397 R.QualifierIsInformative =
true;
1400 if (R.QualifierIsInformative && !R.Qualifier &&
1401 !R.StartsNestedNameSpecifier) {
1402 const DeclContext *Ctx = R.Declaration->getDeclContext();
1403 if (
const auto *Namespace = dyn_cast<NamespaceDecl>(Ctx))
1406 else if (
const auto *Tag = dyn_cast<TagDecl>(Ctx))
1408 SemaRef.
Context,
nullptr,
false,
1411 R.QualifierIsInformative =
false;
1418 AdjustResultPriorityForDecl(R);
1420 if (HasObjectTypeQualifiers)
1421 if (
const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration))
1424 if (ObjectTypeQualifiers == MethodQuals)
1426 else if (ObjectTypeQualifiers - MethodQuals) {
1448 auto &OverloadSet = OverloadMap[std::make_pair(
1450 for (
const DeclIndexPair Entry : OverloadSet) {
1451 Result &Incumbent = Results[Entry.second];
1453 *cast<CXXMethodDecl>(Incumbent.Declaration),
1454 ObjectTypeQualifiers, ObjectKind,
1456 case OverloadCompare::Dominates:
1460 Incumbent = std::move(R);
1462 case OverloadCompare::Dominated:
1465 case OverloadCompare::BothViable:
1469 OverloadSet.Add(Method, Results.size());
1472 R.FunctionCanBeCall = canFunctionBeCalled(R.getDeclaration(), BaseExprType);
1475 Results.push_back(R);
1477 if (!AsNestedNameSpecifier)
1478 MaybeAddConstructorResults(R);
1481void ResultBuilder::AddResult(
Result R) {
1482 assert(R.Kind != Result::RK_Declaration &&
1483 "Declaration results need more context");
1484 Results.push_back(R);
1488void ResultBuilder::EnterNewScope() { ShadowMaps.emplace_back(); }
1491void ResultBuilder::ExitScope() {
1492 ShadowMaps.pop_back();
1497bool ResultBuilder::IsOrdinaryName(
const NamedDecl *ND)
const {
1506 if (isa<ObjCIvarDecl>(ND))
1515bool ResultBuilder::IsOrdinaryNonTypeName(
const NamedDecl *ND)
const {
1517 if (isa<TypeDecl>(ND))
1522 if (
const auto *ID = dyn_cast<ObjCInterfaceDecl>(ND)) {
1523 if (!
ID->getDefinition())
1531 if (isa<ObjCIvarDecl>(ND))
1538bool ResultBuilder::IsIntegralConstantValue(
const NamedDecl *ND)
const {
1539 if (!IsOrdinaryNonTypeName(ND))
1543 if (VD->getType()->isIntegralOrEnumerationType())
1551bool ResultBuilder::IsOrdinaryNonValueName(
const NamedDecl *ND)
const {
1559 !isa<FunctionTemplateDecl>(ND) && !isa<ObjCPropertyDecl>(ND);
1564bool ResultBuilder::IsNestedNameSpecifier(
const NamedDecl *ND)
const {
1566 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1567 ND = ClassTemplate->getTemplatedDecl();
1573bool ResultBuilder::IsEnum(
const NamedDecl *ND)
const {
1574 return isa<EnumDecl>(ND);
1578bool ResultBuilder::IsClassOrStruct(
const NamedDecl *ND)
const {
1580 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1581 ND = ClassTemplate->getTemplatedDecl();
1584 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1593bool ResultBuilder::IsUnion(
const NamedDecl *ND)
const {
1595 if (
const auto *ClassTemplate = dyn_cast<ClassTemplateDecl>(ND))
1596 ND = ClassTemplate->getTemplatedDecl();
1598 if (
const auto *RD = dyn_cast<RecordDecl>(ND))
1605bool ResultBuilder::IsNamespace(
const NamedDecl *ND)
const {
1606 return isa<NamespaceDecl>(ND);
1611bool ResultBuilder::IsNamespaceOrAlias(
const NamedDecl *ND)
const {
1616bool ResultBuilder::IsType(
const NamedDecl *ND)
const {
1618 return isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
1624bool ResultBuilder::IsMember(
const NamedDecl *ND)
const {
1626 return isa<ValueDecl>(ND) || isa<FunctionTemplateDecl>(ND) ||
1627 isa<ObjCPropertyDecl>(ND);
1631 T =
C.getCanonicalType(
T);
1633 case Type::ObjCObject:
1634 case Type::ObjCInterface:
1635 case Type::ObjCObjectPointer:
1639 switch (cast<BuiltinType>(
T)->
getKind()) {
1640 case BuiltinType::ObjCId:
1641 case BuiltinType::ObjCClass:
1642 case BuiltinType::ObjCSel:
1654 if (!
C.getLangOpts().CPlusPlus)
1663bool ResultBuilder::IsObjCMessageReceiver(
const NamedDecl *ND)
const {
1672bool ResultBuilder::IsObjCMessageReceiverOrLambdaCapture(
1674 if (IsObjCMessageReceiver(ND))
1677 const auto *Var = dyn_cast<VarDecl>(ND);
1681 return Var->hasLocalStorage() && !Var->hasAttr<BlocksAttr>();
1684bool ResultBuilder::IsObjCCollection(
const NamedDecl *ND)
const {
1685 if ((SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryName(ND)) ||
1686 (!SemaRef.
getLangOpts().CPlusPlus && !IsOrdinaryNonTypeName(ND)))
1699bool ResultBuilder::IsImpossibleToSatisfy(
const NamedDecl *ND)
const {
1705bool ResultBuilder::IsObjCIvar(
const NamedDecl *ND)
const {
1706 return isa<ObjCIvarDecl>(ND);
1714 ResultBuilder &Results;
1720 std::vector<FixItHint> FixIts;
1723 CodeCompletionDeclConsumer(
1724 ResultBuilder &Results,
DeclContext *InitialLookupCtx,
1726 std::vector<FixItHint> FixIts = std::vector<FixItHint>())
1727 : Results(Results), InitialLookupCtx(InitialLookupCtx),
1728 FixIts(
std::move(FixIts)) {
1729 NamingClass = llvm::dyn_cast<CXXRecordDecl>(InitialLookupCtx);
1732 auto ThisType = Results.getSema().getCurrentThisType();
1733 if (!ThisType.isNull()) {
1734 assert(ThisType->isPointerType());
1740 this->BaseType = BaseType;
1744 bool InBaseClass)
override {
1747 Results.AddResult(Result, InitialLookupCtx, Hiding, InBaseClass, BaseType);
1751 Results.addVisitedContext(Ctx);
1760 auto *NamingClass = this->NamingClass;
1761 QualType BaseType = this->BaseType;
1762 if (
auto *Cls = llvm::dyn_cast_or_null<CXXRecordDecl>(Ctx)) {
1777 NamingClass =
nullptr;
1780 return Results.getSema().IsSimplyAccessible(ND, NamingClass, BaseType);
1787 ResultBuilder &Results) {
1814 Results.getCodeCompletionTUInfo());
1815 if (LangOpts.CPlusPlus) {
1823 Builder.AddTypedTextChunk(
"typename");
1825 Builder.AddPlaceholderChunk(
"name");
1826 Results.AddResult(
Result(Builder.TakeString()));
1828 if (LangOpts.CPlusPlus11) {
1833 Builder.AddTypedTextChunk(
"decltype");
1835 Builder.AddPlaceholderChunk(
"expression");
1837 Results.AddResult(
Result(Builder.TakeString()));
1840 if (LangOpts.Char8 || LangOpts.CPlusPlus20)
1846 if (LangOpts.GNUKeywords) {
1852 Builder.AddTypedTextChunk(
"typeof");
1854 Builder.AddPlaceholderChunk(
"expression");
1855 Results.AddResult(
Result(Builder.TakeString()));
1857 Builder.AddTypedTextChunk(
"typeof");
1859 Builder.AddPlaceholderChunk(
"type");
1861 Results.AddResult(
Result(Builder.TakeString()));
1872 const LangOptions &LangOpts, ResultBuilder &Results) {
1877 Results.AddResult(
Result(
"extern"));
1878 Results.AddResult(
Result(
"static"));
1880 if (LangOpts.CPlusPlus11) {
1885 Builder.AddTypedTextChunk(
"alignas");
1887 Builder.AddPlaceholderChunk(
"expression");
1889 Results.AddResult(
Result(Builder.TakeString()));
1891 Results.AddResult(
Result(
"constexpr"));
1892 Results.AddResult(
Result(
"thread_local"));
1895 if (LangOpts.CPlusPlus20)
1896 Results.AddResult(
Result(
"constinit"));
1901 const LangOptions &LangOpts, ResultBuilder &Results) {
1906 if (LangOpts.CPlusPlus) {
1907 Results.AddResult(
Result(
"explicit"));
1908 Results.AddResult(
Result(
"friend"));
1909 Results.AddResult(
Result(
"mutable"));
1910 Results.AddResult(
Result(
"virtual"));
1918 if (LangOpts.CPlusPlus || LangOpts.C99)
1919 Results.AddResult(
Result(
"inline"));
1921 if (LangOpts.CPlusPlus20)
1922 Results.AddResult(
Result(
"consteval"));
1942 ResultBuilder &Results,
bool NeedAt);
1944 ResultBuilder &Results,
bool NeedAt);
1946 ResultBuilder &Results,
bool NeedAt);
1951 Results.getCodeCompletionTUInfo());
1952 Builder.AddTypedTextChunk(
"typedef");
1954 Builder.AddPlaceholderChunk(
"type");
1956 Builder.AddPlaceholderChunk(
"name");
1963 ResultBuilder &Results) {
1964 Builder.AddTypedTextChunk(
"using");
1966 Builder.AddPlaceholderChunk(
"name");
1968 Builder.AddPlaceholderChunk(
"type");
1991 return LangOpts.CPlusPlus;
1998 return LangOpts.CPlusPlus || LangOpts.ObjC || LangOpts.C99;
2001 llvm_unreachable(
"Invalid ParserCompletionContext!");
2028 if (!
T.getLocalQualifiers()) {
2031 return BT->getNameAsCString(Policy);
2034 if (
const TagType *TagT = dyn_cast<TagType>(
T))
2035 if (
TagDecl *Tag = TagT->getDecl())
2036 if (!Tag->hasNameForLinkage()) {
2037 switch (Tag->getTagKind()) {
2039 return "struct <anonymous>";
2041 return "__interface <anonymous>";
2043 return "class <anonymous>";
2045 return "union <anonymous>";
2047 return "enum <anonymous>";
2054 T.getAsStringInternal(
Result, Policy);
2055 return Allocator.CopyString(
Result);
2067 Builder.AddResultTypeChunk(
2069 Builder.AddTypedTextChunk(
"this");
2074 ResultBuilder &Results,
2076 if (!LangOpts.CPlusPlus11)
2079 Builder.AddTypedTextChunk(
"static_assert");
2081 Builder.AddPlaceholderChunk(
"expression");
2083 Builder.AddPlaceholderChunk(
"message");
2092 Sema &S = Results.getSema();
2093 const auto *CR = llvm::dyn_cast<CXXRecordDecl>(S.
CurContext);
2099 llvm::StringMap<std::vector<FunctionDecl *>> Overrides;
2100 for (
auto *Method : CR->methods()) {
2103 Overrides[Method->
getName()].push_back(Method);
2106 for (
const auto &
Base : CR->bases()) {
2107 const auto *BR =
Base.getType().getTypePtr()->getAsCXXRecordDecl();
2110 for (
auto *Method : BR->methods()) {
2113 const auto it = Overrides.find(Method->
getName());
2114 bool IsOverriden =
false;
2115 if (it != Overrides.end()) {
2116 for (
auto *MD : it->second) {
2134 false, CCContext, Policy);
2144 Scope *S,
Sema &SemaRef, ResultBuilder &Results) {
2152 if (Results.includeCodePatterns()) {
2154 Builder.AddTypedTextChunk(
"namespace");
2156 Builder.AddPlaceholderChunk(
"identifier");
2160 Builder.AddPlaceholderChunk(
"declarations");
2163 Results.AddResult(
Result(Builder.TakeString()));
2167 Builder.AddTypedTextChunk(
"namespace");
2169 Builder.AddPlaceholderChunk(
"name");
2171 Builder.AddPlaceholderChunk(
"namespace");
2173 Results.AddResult(
Result(Builder.TakeString()));
2176 Builder.AddTypedTextChunk(
"using namespace");
2178 Builder.AddPlaceholderChunk(
"identifier");
2180 Results.AddResult(
Result(Builder.TakeString()));
2183 Builder.AddTypedTextChunk(
"asm");
2185 Builder.AddPlaceholderChunk(
"string-literal");
2187 Results.AddResult(
Result(Builder.TakeString()));
2189 if (Results.includeCodePatterns()) {
2191 Builder.AddTypedTextChunk(
"template");
2193 Builder.AddPlaceholderChunk(
"declaration");
2194 Results.AddResult(
Result(Builder.TakeString()));
2205 if (!CurrentModule) {
2207 Builder.AddTypedTextChunk(
"module");
2210 Results.AddResult(
Result(Builder.TakeString()));
2215 if (!CurrentModule ||
2220 Builder.AddTypedTextChunk(
"module");
2222 Builder.AddPlaceholderChunk(
"name");
2225 Results.AddResult(
Result(Builder.TakeString()));
2230 if (!CurrentModule ||
2234 Builder.AddTypedTextChunk(
"import");
2236 Builder.AddPlaceholderChunk(
"name");
2239 Results.AddResult(
Result(Builder.TakeString()));
2242 if (CurrentModule &&
2246 Builder.AddTypedTextChunk(
"module");
2249 Builder.AddTypedTextChunk(
"private");
2252 Results.AddResult(
Result(Builder.TakeString()));
2257 if (!CurrentModule ||
2272 Builder.AddTypedTextChunk(
"using");
2274 Builder.AddPlaceholderChunk(
"qualifier");
2275 Builder.AddTextChunk(
"::");
2276 Builder.AddPlaceholderChunk(
"name");
2278 Results.AddResult(
Result(Builder.TakeString()));
2285 Builder.AddTypedTextChunk(
"using typename");
2287 Builder.AddPlaceholderChunk(
"qualifier");
2288 Builder.AddTextChunk(
"::");
2289 Builder.AddPlaceholderChunk(
"name");
2291 Results.AddResult(
Result(Builder.TakeString()));
2299 bool IsNotInheritanceScope = !S->isClassInheritanceScope();
2301 Builder.AddTypedTextChunk(
"public");
2302 if (IsNotInheritanceScope && Results.includeCodePatterns())
2304 Results.AddResult(
Result(Builder.TakeString()));
2307 Builder.AddTypedTextChunk(
"protected");
2308 if (IsNotInheritanceScope && Results.includeCodePatterns())
2310 Results.AddResult(
Result(Builder.TakeString()));
2313 Builder.AddTypedTextChunk(
"private");
2314 if (IsNotInheritanceScope && Results.includeCodePatterns())
2316 Results.AddResult(
Result(Builder.TakeString()));
2334 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns()) {
2336 Builder.AddTypedTextChunk(
"template");
2338 Builder.AddPlaceholderChunk(
"parameters");
2340 Results.AddResult(
Result(Builder.TakeString()));
2378 if (SemaRef.
getLangOpts().CPlusPlus && Results.includeCodePatterns() &&
2380 Builder.AddTypedTextChunk(
"try");
2384 Builder.AddPlaceholderChunk(
"statements");
2388 Builder.AddTextChunk(
"catch");
2391 Builder.AddPlaceholderChunk(
"declaration");
2396 Builder.AddPlaceholderChunk(
"statements");
2399 Results.AddResult(
Result(Builder.TakeString()));
2404 if (Results.includeCodePatterns()) {
2406 Builder.AddTypedTextChunk(
"if");
2410 Builder.AddPlaceholderChunk(
"condition");
2412 Builder.AddPlaceholderChunk(
"expression");
2417 Builder.AddPlaceholderChunk(
"statements");
2420 Results.AddResult(
Result(Builder.TakeString()));
2423 Builder.AddTypedTextChunk(
"switch");
2427 Builder.AddPlaceholderChunk(
"condition");
2429 Builder.AddPlaceholderChunk(
"expression");
2434 Builder.AddPlaceholderChunk(
"cases");
2437 Results.AddResult(
Result(Builder.TakeString()));
2444 Builder.AddTypedTextChunk(
"case");
2446 Builder.AddPlaceholderChunk(
"expression");
2448 Results.AddResult(
Result(Builder.TakeString()));
2451 Builder.AddTypedTextChunk(
"default");
2453 Results.AddResult(
Result(Builder.TakeString()));
2456 if (Results.includeCodePatterns()) {
2458 Builder.AddTypedTextChunk(
"while");
2462 Builder.AddPlaceholderChunk(
"condition");
2464 Builder.AddPlaceholderChunk(
"expression");
2469 Builder.AddPlaceholderChunk(
"statements");
2472 Results.AddResult(
Result(Builder.TakeString()));
2475 Builder.AddTypedTextChunk(
"do");
2479 Builder.AddPlaceholderChunk(
"statements");
2482 Builder.AddTextChunk(
"while");
2485 Builder.AddPlaceholderChunk(
"expression");
2487 Results.AddResult(
Result(Builder.TakeString()));
2490 Builder.AddTypedTextChunk(
"for");
2494 Builder.AddPlaceholderChunk(
"init-statement");
2496 Builder.AddPlaceholderChunk(
"init-expression");
2499 Builder.AddPlaceholderChunk(
"condition");
2502 Builder.AddPlaceholderChunk(
"inc-expression");
2507 Builder.AddPlaceholderChunk(
"statements");
2510 Results.AddResult(
Result(Builder.TakeString()));
2514 Builder.AddTypedTextChunk(
"for");
2517 Builder.AddPlaceholderChunk(
"range-declaration");
2520 Builder.AddTextChunk(
"in");
2524 Builder.AddPlaceholderChunk(
"range-expression");
2529 Builder.AddPlaceholderChunk(
"statements");
2532 Results.AddResult(
Result(Builder.TakeString()));
2536 if (S->getContinueParent()) {
2538 Builder.AddTypedTextChunk(
"continue");
2540 Results.AddResult(
Result(Builder.TakeString()));
2543 if (S->getBreakParent()) {
2545 Builder.AddTypedTextChunk(
"break");
2547 Results.AddResult(
Result(Builder.TakeString()));
2553 ReturnType =
Function->getReturnType();
2554 else if (
const auto *Method = dyn_cast<ObjCMethodDecl>(SemaRef.
CurContext))
2560 Builder.AddTypedTextChunk(
"return");
2562 Results.AddResult(
Result(Builder.TakeString()));
2564 assert(!ReturnType.
isNull());
2566 Builder.AddTypedTextChunk(
"return");
2568 Builder.AddPlaceholderChunk(
"expression");
2570 Results.AddResult(
Result(Builder.TakeString()));
2573 Builder.AddTypedTextChunk(
"co_return");
2575 Builder.AddPlaceholderChunk(
"expression");
2577 Results.AddResult(
Result(Builder.TakeString()));
2581 Builder.AddTypedTextChunk(
"return true");
2583 Results.AddResult(
Result(Builder.TakeString()));
2585 Builder.AddTypedTextChunk(
"return false");
2587 Results.AddResult(
Result(Builder.TakeString()));
2592 Builder.AddTypedTextChunk(
"return nullptr");
2594 Results.AddResult(
Result(Builder.TakeString()));
2599 Builder.AddTypedTextChunk(
"goto");
2601 Builder.AddPlaceholderChunk(
"label");
2603 Results.AddResult(
Result(Builder.TakeString()));
2606 Builder.AddTypedTextChunk(
"using namespace");
2608 Builder.AddPlaceholderChunk(
"identifier");
2610 Results.AddResult(
Result(Builder.TakeString()));
2627 Builder.AddTypedTextChunk(
"__bridge");
2629 Builder.AddPlaceholderChunk(
"type");
2631 Builder.AddPlaceholderChunk(
"expression");
2632 Results.AddResult(
Result(Builder.TakeString()));
2635 Builder.AddTypedTextChunk(
"__bridge_transfer");
2637 Builder.AddPlaceholderChunk(
"Objective-C type");
2639 Builder.AddPlaceholderChunk(
"expression");
2640 Results.AddResult(
Result(Builder.TakeString()));
2643 Builder.AddTypedTextChunk(
"__bridge_retained");
2645 Builder.AddPlaceholderChunk(
"CF type");
2647 Builder.AddPlaceholderChunk(
"expression");
2648 Results.AddResult(
Result(Builder.TakeString()));
2659 Builder.AddResultTypeChunk(
"bool");
2660 Builder.AddTypedTextChunk(
"true");
2661 Results.AddResult(
Result(Builder.TakeString()));
2664 Builder.AddResultTypeChunk(
"bool");
2665 Builder.AddTypedTextChunk(
"false");
2666 Results.AddResult(
Result(Builder.TakeString()));
2670 Builder.AddTypedTextChunk(
"dynamic_cast");
2672 Builder.AddPlaceholderChunk(
"type");
2675 Builder.AddPlaceholderChunk(
"expression");
2677 Results.AddResult(
Result(Builder.TakeString()));
2681 Builder.AddTypedTextChunk(
"static_cast");
2683 Builder.AddPlaceholderChunk(
"type");
2686 Builder.AddPlaceholderChunk(
"expression");
2688 Results.AddResult(
Result(Builder.TakeString()));
2691 Builder.AddTypedTextChunk(
"reinterpret_cast");
2693 Builder.AddPlaceholderChunk(
"type");
2696 Builder.AddPlaceholderChunk(
"expression");
2698 Results.AddResult(
Result(Builder.TakeString()));
2701 Builder.AddTypedTextChunk(
"const_cast");
2703 Builder.AddPlaceholderChunk(
"type");
2706 Builder.AddPlaceholderChunk(
"expression");
2708 Results.AddResult(
Result(Builder.TakeString()));
2712 Builder.AddResultTypeChunk(
"std::type_info");
2713 Builder.AddTypedTextChunk(
"typeid");
2715 Builder.AddPlaceholderChunk(
"expression-or-type");
2717 Results.AddResult(
Result(Builder.TakeString()));
2721 Builder.AddTypedTextChunk(
"new");
2723 Builder.AddPlaceholderChunk(
"type");
2725 Builder.AddPlaceholderChunk(
"expressions");
2727 Results.AddResult(
Result(Builder.TakeString()));
2730 Builder.AddTypedTextChunk(
"new");
2732 Builder.AddPlaceholderChunk(
"type");
2734 Builder.AddPlaceholderChunk(
"size");
2737 Builder.AddPlaceholderChunk(
"expressions");
2739 Results.AddResult(
Result(Builder.TakeString()));
2742 Builder.AddResultTypeChunk(
"void");
2743 Builder.AddTypedTextChunk(
"delete");
2745 Builder.AddPlaceholderChunk(
"expression");
2746 Results.AddResult(
Result(Builder.TakeString()));
2749 Builder.AddResultTypeChunk(
"void");
2750 Builder.AddTypedTextChunk(
"delete");
2755 Builder.AddPlaceholderChunk(
"expression");
2756 Results.AddResult(
Result(Builder.TakeString()));
2760 Builder.AddResultTypeChunk(
"void");
2761 Builder.AddTypedTextChunk(
"throw");
2763 Builder.AddPlaceholderChunk(
"expression");
2764 Results.AddResult(
Result(Builder.TakeString()));
2771 Builder.AddResultTypeChunk(
"std::nullptr_t");
2772 Builder.AddTypedTextChunk(
"nullptr");
2773 Results.AddResult(
Result(Builder.TakeString()));
2776 Builder.AddResultTypeChunk(
"size_t");
2777 Builder.AddTypedTextChunk(
"alignof");
2779 Builder.AddPlaceholderChunk(
"type");
2781 Results.AddResult(
Result(Builder.TakeString()));
2784 Builder.AddResultTypeChunk(
"bool");
2785 Builder.AddTypedTextChunk(
"noexcept");
2787 Builder.AddPlaceholderChunk(
"expression");
2789 Results.AddResult(
Result(Builder.TakeString()));
2792 Builder.AddResultTypeChunk(
"size_t");
2793 Builder.AddTypedTextChunk(
"sizeof...");
2795 Builder.AddPlaceholderChunk(
"parameter-pack");
2797 Results.AddResult(
Result(Builder.TakeString()));
2802 Builder.AddTypedTextChunk(
"co_await");
2804 Builder.AddPlaceholderChunk(
"expression");
2805 Results.AddResult(
Result(Builder.TakeString()));
2808 Builder.AddTypedTextChunk(
"co_yield");
2810 Builder.AddPlaceholderChunk(
"expression");
2811 Results.AddResult(
Result(Builder.TakeString()));
2814 Builder.AddResultTypeChunk(
"bool");
2815 Builder.AddTypedTextChunk(
"requires");
2818 Builder.AddPlaceholderChunk(
"parameters");
2823 Builder.AddPlaceholderChunk(
"requirements");
2826 Results.AddResult(
Result(Builder.TakeString()));
2830 Builder.AddTypedTextChunk(
"requires");
2832 Builder.AddPlaceholderChunk(
"expression");
2834 Results.AddResult(
Result(Builder.TakeString()));
2844 if (ID->getSuperClass()) {
2845 std::string SuperType;
2846 SuperType = ID->getSuperClass()->getNameAsString();
2847 if (Method->isInstanceMethod())
2850 Builder.AddResultTypeChunk(Allocator.CopyString(SuperType));
2851 Builder.AddTypedTextChunk(
"super");
2852 Results.AddResult(
Result(Builder.TakeString()));
2861 Builder.AddResultTypeChunk(
"size_t");
2863 Builder.AddTypedTextChunk(
"alignof");
2865 Builder.AddTypedTextChunk(
"_Alignof");
2867 Builder.AddPlaceholderChunk(
"type");
2869 Results.AddResult(
Result(Builder.TakeString()));
2874 Builder.AddResultTypeChunk(
"nullptr_t");
2875 Builder.AddTypedTextChunk(
"nullptr");
2876 Results.AddResult(
Result(Builder.TakeString()));
2880 Builder.AddResultTypeChunk(
"size_t");
2881 Builder.AddTypedTextChunk(
"sizeof");
2883 Builder.AddPlaceholderChunk(
"expression-or-type");
2885 Results.AddResult(
Result(Builder.TakeString()));
2898 Results.AddResult(
Result(
"operator"));
2919 else if (
const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
2921 T = Method->getSendResultType(BaseType);
2924 }
else if (
const auto *Enumerator = dyn_cast<EnumConstantDecl>(ND)) {
2927 }
else if (isa<UnresolvedUsingValueDecl>(ND)) {
2929 }
else if (
const auto *Ivar = dyn_cast<ObjCIvarDecl>(ND)) {
2931 T = Ivar->getUsageType(BaseType);
2933 T = Ivar->getType();
2934 }
else if (
const auto *
Value = dyn_cast<ValueDecl>(ND)) {
2936 }
else if (
const auto *
Property = dyn_cast<ObjCPropertyDecl>(ND)) {
2946 Result.AddResultTypeChunk(
2953 if (SentinelAttr *Sentinel = FunctionOrMethod->
getAttr<SentinelAttr>())
2954 if (Sentinel->getSentinel() == 0) {
2956 Result.AddTextChunk(
", nil");
2958 Result.AddTextChunk(
", NULL");
2960 Result.AddTextChunk(
", (void*)0");
2981 switch (*nullability) {
2991 Result +=
"null_unspecified ";
2995 llvm_unreachable(
"Not supported as a context-sensitive keyword!");
3012 bool SuppressBlock =
false) {
3018 if (!SuppressBlock) {
3021 TypedefTL.getTypedefNameDecl()->getTypeSourceInfo()) {
3034 TL = AttrTL.getModifiedLoc();
3053 bool SuppressBlockName =
false,
bool SuppressBlock =
false,
3058 bool SuppressName =
false,
bool SuppressBlock =
false,
3066 if (
const auto *PVD = dyn_cast<ParmVarDecl>(Param))
3067 ObjCQual = PVD->getObjCDeclQualifier();
3068 bool ObjCMethodParam = isa<ObjCMethodDecl>(Param->
getDeclContext());
3075 if (Param->
getIdentifier() && !ObjCMethodParam && !SuppressName)
3082 if (ObjCMethodParam) {
3101 if (!
Block && ObjCMethodParam &&
3102 cast<ObjCMethodDecl>(Param->
getDeclContext())->isPropertyAccessor()) {
3103 if (
const auto *PD = cast<ObjCMethodDecl>(Param->
getDeclContext())
3104 ->findPropertyDecl(
false))
3118 if (ObjCMethodParam) {
3123 if (
Result.back() !=
')')
3137 false, SuppressBlock,
3153 bool SuppressBlockName,
bool SuppressBlock,
3161 if (!ResultType->
isVoidType() || SuppressBlock)
3166 if (!BlockProto ||
Block.getNumParams() == 0) {
3173 for (
unsigned I = 0, N =
Block.getNumParams(); I != N; ++I) {
3186 if (SuppressBlock) {
3189 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3198 if (!SuppressBlockName &&
BlockDecl->getIdentifier())
3218 if (srcText.empty() || srcText ==
"=") {
3224 std::string DefValue(srcText.str());
3227 if (DefValue.at(0) !=
'=') {
3231 return " = " + DefValue;
3233 return " " + DefValue;
3242 bool InOptional =
false) {
3243 bool FirstParameter =
true;
3245 for (
unsigned P = Start, N =
Function->getNumParams();
P != N; ++
P) {
3252 Result.getCodeCompletionTUInfo());
3253 if (!FirstParameter)
3261 FirstParameter =
false;
3273 if (
Function->isVariadic() &&
P == N - 1)
3274 PlaceholderStr +=
", ...";
3277 Result.AddPlaceholderChunk(
3278 Result.getAllocator().CopyString(PlaceholderStr));
3282 if (Proto->isVariadic()) {
3283 if (Proto->getNumParams() == 0)
3284 Result.AddPlaceholderChunk(
"...");
3294 unsigned MaxParameters = 0,
unsigned Start = 0,
bool InDefaultArg =
false) {
3295 bool FirstParameter =
true;
3304 PEnd = Params->
begin() + MaxParameters;
3307 bool HasDefaultArg =
false;
3308 std::string PlaceholderStr;
3310 if (TTP->wasDeclaredWithTypename())
3311 PlaceholderStr =
"typename";
3312 else if (
const auto *TC = TTP->getTypeConstraint()) {
3313 llvm::raw_string_ostream OS(PlaceholderStr);
3314 TC->print(OS, Policy);
3316 PlaceholderStr =
"class";
3318 if (TTP->getIdentifier()) {
3319 PlaceholderStr +=
' ';
3320 PlaceholderStr += TTP->getIdentifier()->deuglifiedName();
3323 HasDefaultArg = TTP->hasDefaultArgument();
3325 dyn_cast<NonTypeTemplateParmDecl>(*
P)) {
3326 if (NTTP->getIdentifier())
3327 PlaceholderStr = std::string(NTTP->getIdentifier()->deuglifiedName());
3328 NTTP->getType().getAsStringInternal(PlaceholderStr, Policy);
3329 HasDefaultArg = NTTP->hasDefaultArgument();
3331 assert(isa<TemplateTemplateParmDecl>(*
P));
3336 PlaceholderStr =
"template<...> class";
3338 PlaceholderStr +=
' ';
3345 if (HasDefaultArg && !InDefaultArg) {
3349 Result.getCodeCompletionTUInfo());
3350 if (!FirstParameter)
3353 P - Params->
begin(),
true);
3358 InDefaultArg =
false;
3361 FirstParameter =
false;
3366 Result.AddPlaceholderChunk(
3367 Result.getAllocator().CopyString(PlaceholderStr));
3375 bool QualifierIsInformative,
3381 std::string PrintedNNS;
3383 llvm::raw_string_ostream OS(PrintedNNS);
3384 Qualifier->print(OS, Policy);
3386 if (QualifierIsInformative)
3387 Result.AddInformativeChunk(
Result.getAllocator().CopyString(PrintedNNS));
3389 Result.AddTextChunk(
Result.getAllocator().CopyString(PrintedNNS));
3396 if (!Proto || !Proto->getMethodQuals())
3402 if (Proto->getMethodQuals().hasOnlyConst()) {
3403 Result.AddInformativeChunk(
" const");
3407 if (Proto->getMethodQuals().hasOnlyVolatile()) {
3408 Result.AddInformativeChunk(
" volatile");
3412 if (Proto->getMethodQuals().hasOnlyRestrict()) {
3413 Result.AddInformativeChunk(
" restrict");
3418 std::string QualsStr;
3419 if (Proto->isConst())
3420 QualsStr +=
" const";
3421 if (Proto->isVolatile())
3422 QualsStr +=
" volatile";
3423 if (Proto->isRestrict())
3424 QualsStr +=
" restrict";
3425 Result.AddInformativeChunk(
Result.getAllocator().CopyString(QualsStr));
3436 switch (Name.getNameKind()) {
3438 const char *OperatorName =
nullptr;
3439 switch (Name.getCXXOverloadedOperator()) {
3441 case OO_Conditional:
3443 OperatorName =
"operator";
3446#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
3448 OperatorName = "operator" Spelling; \
3450#define OVERLOADED_OPERATOR_MULTI(Name, Spelling, Unary, Binary, MemberOnly)
3451#include "clang/Basic/OperatorKinds.def"
3454 OperatorName =
"operator new";
3457 OperatorName =
"operator delete";
3460 OperatorName =
"operator new[]";
3462 case OO_Array_Delete:
3463 OperatorName =
"operator delete[]";
3466 OperatorName =
"operator()";
3469 OperatorName =
"operator[]";
3472 Result.AddTypedTextChunk(OperatorName);
3480 Result.AddTypedTextChunk(
3493 QualType Ty = Name.getCXXNameType();
3495 Record = cast<CXXRecordDecl>(RecordTy->getDecl());
3497 Record = InjectedTy->getDecl();
3499 Result.AddTypedTextChunk(
3504 Result.AddTypedTextChunk(
3505 Result.getAllocator().CopyString(
Record->getNameAsString()));
3519 bool IncludeBriefComments) {
3521 CCTUInfo, IncludeBriefComments);
3533 return Result.TakeString();
3544 Result.AddPlaceholderChunk(
"...");
3558 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
3563 Result.AddPlaceholderChunk(
3564 Result.getAllocator().CopyString((*A)->getName()));
3567 return Result.TakeString();
3579 bool IncludeBriefComments) {
3595 Result.addBriefComment(RC->getBriefText(Ctx));
3605 return Result.TakeString();
3609 PP, Ctx,
Result, IncludeBriefComments, CCContext, Policy);
3613 std::string &BeforeName,
3614 std::string &NameAndSignature) {
3615 bool SeenTypedChunk =
false;
3616 for (
auto &Chunk : CCS) {
3618 assert(SeenTypedChunk &&
"optional parameter before name");
3625 NameAndSignature += Chunk.Text;
3627 BeforeName += Chunk.Text;
3639 std::string BeforeName;
3640 std::string NameAndSignature;
3643 NameAndSignature +=
" override";
3645 Result.AddTextChunk(
Result.getAllocator().CopyString(BeforeName));
3647 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(NameAndSignature));
3648 return Result.TakeString();
3654 const auto *VD = dyn_cast<VarDecl>(ND);
3657 const auto *
RecordDecl = VD->getType()->getAsCXXRecordDecl();
3670 if (IncludeBriefComments) {
3673 Result.addBriefComment(RC->getBriefText(Ctx));
3678 Result.AddTypedTextChunk(
3680 Result.AddTextChunk(
"::");
3681 return Result.TakeString();
3685 Result.AddAnnotation(
Result.getAllocator().CopyString(I->getAnnotation()));
3698 if (
const auto *
Function = dyn_cast<FunctionDecl>(ND)) {
3699 AddFunctionTypeAndResult(
Function);
3700 return Result.TakeString();
3703 if (
const auto *CallOperator =
3705 AddFunctionTypeAndResult(CallOperator);
3706 return Result.TakeString();
3712 dyn_cast<FunctionTemplateDecl>(ND)) {
3723 llvm::SmallBitVector Deduced(FunTmpl->getTemplateParameters()->size());
3728 unsigned LastDeducibleArgument;
3729 for (LastDeducibleArgument = Deduced.size(); LastDeducibleArgument > 0;
3730 --LastDeducibleArgument) {
3731 if (!Deduced[LastDeducibleArgument - 1]) {
3735 bool HasDefaultArg =
false;
3736 NamedDecl *Param = FunTmpl->getTemplateParameters()->getParam(
3737 LastDeducibleArgument - 1);
3739 HasDefaultArg = TTP->hasDefaultArgument();
3741 dyn_cast<NonTypeTemplateParmDecl>(Param))
3742 HasDefaultArg = NTTP->hasDefaultArgument();
3744 assert(isa<TemplateTemplateParmDecl>(Param));
3746 cast<TemplateTemplateParmDecl>(Param)->hasDefaultArgument();
3769 LastDeducibleArgument);
3778 return Result.TakeString();
3781 if (
const auto *Template = dyn_cast<TemplateDecl>(ND)) {
3784 Result.AddTypedTextChunk(
3785 Result.getAllocator().CopyString(Template->getNameAsString()));
3789 return Result.TakeString();
3792 if (
const auto *Method = dyn_cast<ObjCMethodDecl>(ND)) {
3793 Selector Sel = Method->getSelector();
3795 Result.AddTypedTextChunk(
3797 return Result.TakeString();
3803 Result.AddTypedTextChunk(
Result.getAllocator().CopyString(SelName));
3805 Result.AddInformativeChunk(
Result.getAllocator().CopyString(SelName));
3810 Result.AddTypedTextChunk(
"");
3817 P != PEnd && Idx < Sel.
getNumArgs(); (
void)++
P, ++Idx) {
3836 QualType ParamType = (*P)->getType();
3837 std::optional<ArrayRef<QualType>> ObjCSubsts;
3853 Arg += II->getName();
3860 Result.AddTextChunk(
Result.getAllocator().CopyString(Arg));
3862 Result.AddInformativeChunk(
Result.getAllocator().CopyString(Arg));
3864 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Arg));
3870 Result.AddTextChunk(
", ...");
3872 Result.AddInformativeChunk(
", ...");
3874 Result.AddPlaceholderChunk(
", ...");
3880 return Result.TakeString();
3887 Result.AddTypedTextChunk(
3889 return Result.TakeString();
3900 const auto *M = dyn_cast<ObjCMethodDecl>(ND);
3912 const auto *M = dyn_cast_or_null<ObjCMethodDecl>(ND);
3913 if (!M || !M->isPropertyAccessor())
3936 auto FDecl =
Result.getFunction();
3939 if (ArgIndex < FDecl->getNumParams())
3947 unsigned CurrentArg) {
3948 unsigned ChunkIndex = 0;
3949 auto AddChunk = [&](llvm::StringRef Placeholder) {
3952 const char *
Copy =
Result.getAllocator().CopyString(Placeholder);
3953 if (ChunkIndex == CurrentArg)
3961 if (
auto *CRD = llvm::dyn_cast<CXXRecordDecl>(RD)) {
3962 for (
const auto &
Base : CRD->bases())
3963 AddChunk(
Base.getType().getAsString(Policy));
3965 for (
const auto &Field : RD->
fields())
3975 unsigned CurrentArg,
unsigned Start = 0,
bool InOptional =
false) {
3981 bool FirstParameter =
true;
3982 unsigned NumParams =
3985 for (
unsigned P = Start;
P != NumParams; ++
P) {
3990 Result.getCodeCompletionTUInfo());
3991 if (!FirstParameter)
3995 PrototypeLoc, Opt, CurrentArg,
P,
4002 FirstParameter =
false;
4009 std::string Placeholder;
4010 assert(P < Prototype->getNumParams());
4019 Placeholder =
Prototype->getParamType(
P).getAsString(Policy);
4022 if (
P == CurrentArg)
4023 Result.AddCurrentParameterChunk(
4024 Result.getAllocator().CopyString(Placeholder));
4026 Result.AddPlaceholderChunk(
Result.getAllocator().CopyString(Placeholder));
4031 Result.getCodeCompletionTUInfo());
4032 if (!FirstParameter)
4035 if (CurrentArg < NumParams)
4047 if (
const auto *
Type = dyn_cast<TemplateTypeParmDecl>(Param)) {
4049 }
else if (
const auto *NonType = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
4050 Optional = NonType->hasDefaultArgument();
4051 }
else if (
const auto *Template = dyn_cast<TemplateTemplateParmDecl>(Param)) {
4052 Optional = Template->hasDefaultArgument();
4055 llvm::raw_string_ostream OS(
Result);
4056 Param->
print(OS, Policy);
4062 if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(TD))
4063 return CTD->getTemplatedDecl()->getKindName().str();
4064 if (
const auto *VTD = dyn_cast<VarTemplateDecl>(TD))
4065 return VTD->getTemplatedDecl()->getType().getAsString(Policy);
4066 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(TD))
4067 return FTD->getTemplatedDecl()->getReturnType().getAsString(Policy);
4068 if (isa<TypeAliasTemplateDecl>(TD))
4070 if (isa<TemplateTemplateParmDecl>(TD))
4072 if (isa<ConceptDecl>(TD))
4082 Builder.getCodeCompletionTUInfo());
4084 if (!ResultType.empty())
4085 Builder.AddResultTypeChunk(Builder.getAllocator().CopyString(ResultType));
4086 Builder.AddTextChunk(
4092 for (
unsigned I = 0; I < Params.size(); ++I) {
4094 std::string Placeholder =
4097 Current = &OptionalBuilder;
4100 Current->AddChunk(I == CurrentArg
4103 Current->getAllocator().CopyString(Placeholder));
4106 if (Current == &OptionalBuilder)
4107 Builder.AddOptionalChunk(OptionalBuilder.
TakeString());
4111 if (isa<FunctionTemplateDecl>(TD))
4112 Builder.AddInformativeChunk(
"()");
4113 return Builder.TakeString();
4120 bool Braced)
const {
4144 if (IncludeBriefComments) {
4151 llvm::raw_string_ostream OS(Name);
4153 Result.AddTextChunk(
Result.getAllocator().CopyString(Name));
4156 Result.AddResultTypeChunk(
Result.getAllocator().CopyString(
4171 return Result.TakeString();
4176 bool PreferredTypeIsPointer) {
4180 if (MacroName ==
"nil" || MacroName ==
"NULL" || MacroName ==
"Nil") {
4182 if (PreferredTypeIsPointer)
4186 else if (MacroName ==
"YES" || MacroName ==
"NO" || MacroName ==
"true" ||
4187 MacroName ==
"false")
4190 else if (MacroName ==
"bool")
4203 case Decl::EnumConstant:
4207 case Decl::Function:
4209 case Decl::ObjCCategory:
4211 case Decl::ObjCCategoryImpl:
4213 case Decl::ObjCImplementation:
4216 case Decl::ObjCInterface:
4218 case Decl::ObjCIvar:
4220 case Decl::ObjCMethod:
4221 return cast<ObjCMethodDecl>(
D)->isInstanceMethod()
4224 case Decl::CXXMethod:
4226 case Decl::CXXConstructor:
4228 case Decl::CXXDestructor:
4230 case Decl::CXXConversion:
4232 case Decl::ObjCProperty:
4234 case Decl::ObjCProtocol:
4240 case Decl::TypeAlias:
4242 case Decl::TypeAliasTemplate:
4246 case Decl::Namespace:
4248 case Decl::NamespaceAlias:
4250 case Decl::TemplateTypeParm:
4252 case Decl::NonTypeTemplateParm:
4254 case Decl::TemplateTemplateParm:
4256 case Decl::FunctionTemplate:
4258 case Decl::ClassTemplate:
4260 case Decl::AccessSpec:
4262 case Decl::ClassTemplatePartialSpecialization:
4264 case Decl::UsingDirective:
4266 case Decl::StaticAssert:
4270 case Decl::TranslationUnit:
4274 case Decl::UnresolvedUsingValue:
4275 case Decl::UnresolvedUsingTypename:
4278 case Decl::UsingEnum:
4281 case Decl::ObjCPropertyImpl:
4282 switch (cast<ObjCPropertyImplDecl>(
D)->getPropertyImplementation()) {
4289 llvm_unreachable(
"Unexpected Kind!");
4294 case Decl::ObjCTypeParam:
4300 case Decl::LinkageSpec:
4304 if (
const auto *TD = dyn_cast<TagDecl>(
D)) {
4305 switch (TD->getTagKind()) {
4323 bool LoadExternal,
bool IncludeUndefined,
4324 bool TargetTypeIsPointer =
false) {
4327 Results.EnterNewScope();
4333 if (IncludeUndefined || MD) {
4341 TargetTypeIsPointer)));
4345 Results.ExitScope();
4349 ResultBuilder &Results) {
4352 Results.EnterNewScope();
4356 if (LangOpts.C99 || LangOpts.CPlusPlus11)
4358 Results.ExitScope();
4365 unsigned NumResults) {
4428 llvm_unreachable(
"Invalid ParserCompletionContext!");
4440 ResultBuilder &Results) {
4443 while (isa<BlockDecl>(CurContext))
4446 CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(CurContext);
4453 if (!
P->getDeclName())
4459 Results.getCodeCompletionTUInfo());
4466 S.
Context, CurContext, Overridden->getDeclContext());
4469 llvm::raw_string_ostream OS(Str);
4470 NNS->
print(OS, Policy);
4471 Builder.AddTextChunk(Results.getAllocator().CopyString(Str));
4473 }
else if (!InContext->
Equals(Overridden->getDeclContext()))
4476 Builder.AddTypedTextChunk(
4477 Results.getAllocator().CopyString(Overridden->getNameAsString()));
4479 bool FirstParam =
true;
4486 Builder.AddPlaceholderChunk(
4487 Results.getAllocator().CopyString(
P->getIdentifier()->getName()));
4493 Results.Ignore(Overridden);
4500 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4501 CodeCompleter->getCodeCompletionTUInfo(),
4503 Results.EnterNewScope();
4512 for (
unsigned I = 0, N = Modules.size(); I != N; ++I) {
4513 Builder.AddTypedTextChunk(
4514 Builder.getAllocator().CopyString(Modules[I]->Name));
4515 Results.AddResult(
Result(
4520 }
else if (getLangOpts().Modules) {
4528 Builder.AddTypedTextChunk(
4529 Builder.getAllocator().CopyString(Submodule->Name));
4530 Results.AddResult(
Result(
4537 Results.ExitScope();
4539 Results.getCompletionContext(), Results.data(),
4545 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4546 CodeCompleter->getCodeCompletionTUInfo(),
4548 Results.EnterNewScope();
4553 switch (CompletionContext) {
4556 case PCC_ObjCInterface:
4557 case PCC_ObjCImplementation:
4558 case PCC_ObjCInstanceVariableList:
4560 case PCC_MemberTemplate:
4562 case PCC_LocalDeclarationSpecifiers:
4563 Results.setFilter(&ResultBuilder::IsOrdinaryNonValueName);
4567 case PCC_TopLevelOrExpression:
4568 case PCC_ParenthesizedExpression:
4569 case PCC_Expression:
4573 Results.setFilter(&ResultBuilder::IsOrdinaryName);
4575 Results.setFilter(&ResultBuilder::IsOrdinaryNonTypeName);
4581 case PCC_RecoveryInFunction:
4589 if (!ThisType.isNull())
4590 Results.setObjectTypeQualifiers(ThisType->getPointeeType().getQualifiers(),
4593 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
4595 CodeCompleter->includeGlobals(),
4596 CodeCompleter->loadExternal());
4599 Results.ExitScope();
4601 switch (CompletionContext) {
4602 case PCC_ParenthesizedExpression:
4603 case PCC_Expression:
4605 case PCC_TopLevelOrExpression:
4606 case PCC_RecoveryInFunction:
4607 if (S->getFnParent())
4613 case PCC_ObjCInterface:
4614 case PCC_ObjCImplementation:
4615 case PCC_ObjCInstanceVariableList:
4617 case PCC_MemberTemplate:
4621 case PCC_LocalDeclarationSpecifiers:
4625 if (CodeCompleter->includeMacros())
4629 Results.getCompletionContext(), Results.data(),
4636 bool AtArgumentExpression,
bool IsSuper,
4637 ResultBuilder &Results);
4640 bool AllowNonIdentifiers,
4641 bool AllowNestedNameSpecifiers) {
4643 ResultBuilder Results(
4644 SemaRef, CodeCompleter->getAllocator(),
4645 CodeCompleter->getCodeCompletionTUInfo(),
4646 AllowNestedNameSpecifiers
4651 Results.EnterNewScope();
4654 Results.AddResult(
Result(
"const"));
4655 Results.AddResult(
Result(
"volatile"));
4656 if (getLangOpts().
C99)
4657 Results.AddResult(
Result(
"restrict"));
4663 Results.AddResult(
"final");
4665 if (AllowNonIdentifiers) {
4666 Results.AddResult(
Result(
"operator"));
4670 if (AllowNestedNameSpecifiers) {
4671 Results.allowNestedNameSpecifiers();
4672 Results.setFilter(&ResultBuilder::IsImpossibleToSatisfy);
4673 CodeCompletionDeclConsumer Consumer(Results, SemaRef.
CurContext);
4675 Consumer, CodeCompleter->includeGlobals(),
4676 CodeCompleter->loadExternal());
4677 Results.setFilter(
nullptr);
4680 Results.ExitScope();
4686 if (AllowNonIdentifiers && !AllowNestedNameSpecifiers &&
4705 Results.getCompletionContext(), Results.data(),
4710 if (
Scope ==
"clang")
4718 if (
Scope ==
"_Clang")
4720 if (
Scope ==
"__gnu__")
4728 if (Completion == AttributeCompletion::None)
4730 ResultBuilder Results(SemaRef, CodeCompleter->getAllocator(),
4731 CodeCompleter->getCodeCompletionTUInfo(),
4744 llvm::StringRef InScopeName;
4745 bool InScopeUnderscore =
false;
4747 InScopeName = InScope->
getName();
4749 InScopeName = NoUnderscore;
4750 InScopeUnderscore =
true;
4757 llvm::DenseSet<llvm::StringRef> FoundScopes;
4759 if (A.IsTargetSpecific &&
4760 !A.existsInTarget(getASTContext().getTargetInfo()))
4762 if (!A.acceptsLangOpts(getLangOpts()))
4764 for (
const auto &S : A.Spellings) {
4765 if (S.Syntax != Syntax)
4767 llvm::StringRef Name = S.NormalizedFullName;
4768 llvm::StringRef
Scope;
4771 std::tie(
Scope, Name) = Name.split(
"::");
4773 std::swap(Name,
Scope);
4777 if (Completion == AttributeCompletion::Scope) {
4779 if (!
Scope.empty() && FoundScopes.insert(
Scope).second) {
4790 if (!InScopeName.empty()) {
4791 if (
Scope != InScopeName)
4796 auto Add = [&](llvm::StringRef
Scope, llvm::StringRef Name,
4799 Results.getCodeCompletionTUInfo());
4801 if (!
Scope.empty()) {
4810 Builder.AddTypedTextChunk(Results.getAllocator().CopyString(
Text));
4812 if (!A.ArgNames.empty()) {
4815 for (
const char *Arg : A.ArgNames) {
4819 Builder.AddPlaceholderChunk(Arg);
4824 Results.AddResult(Builder.TakeString());
4831 if (!InScopeUnderscore)
4832 Add(
Scope, Name,
false);
4837 if (!(InScope && !InScopeUnderscore) && SyntaxSupportsGuards) {
4839 if (
Scope.empty()) {
4840 Add(
Scope, Name,
true);
4845 Add(GuardedScope, Name,
true);
4855 for (
const auto &Entry : ParsedAttrInfoRegistry::entries())
4856 AddCompletions(*Entry.instantiate());
4859 Results.getCompletionContext(), Results.data(),
4865 bool IsParenthesized =
false)
4866 : PreferredType(PreferredType), IntegralConstantExpression(
false),
4867 ObjCCollection(
false), IsParenthesized(IsParenthesized) {}
4878struct CoveredEnumerators {
4886 const CoveredEnumerators &Enumerators) {
4888 if (Context.
getLangOpts().CPlusPlus && !Qualifier && Enumerators.Seen.empty()) {
4895 Results.EnterNewScope();
4896 for (
auto *
E :
Enum->enumerators()) {