25 if (SuperD->getName() ==
"XCTestCase")
45 if (D->
hasAttr<IBOutletAttr>()) {
47 }
else if (D->
hasAttr<IBOutletCollectionAttr>()) {
56 if (isa<ParmVarDecl>(D))
59 if (isa<ObjCTypeParamDecl>(D))
62 if (isa<UsingDirectiveDecl>(D))
67 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
68 switch (ND->getFormalLinkage()) {
74 llvm_unreachable(
"Not a sema linkage");
87 Info.
Kind = SymbolKind::Unknown;
88 Info.
SubKind = SymbolSubKind::None;
90 Info.
Lang = SymbolLanguage::C;
99 if (
auto *VT = dyn_cast<VarTemplateDecl>(D)) {
101 Info.
Lang = SymbolLanguage::CXX;
103 D = VT->getTemplatedDecl();
106 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
107 switch (TD->getTagKind()) {
109 Info.
Kind = SymbolKind::Struct;
break;
111 Info.
Kind = SymbolKind::Union;
break;
113 Info.
Kind = SymbolKind::Class;
114 Info.
Lang = SymbolLanguage::CXX;
117 Info.
Kind = SymbolKind::Protocol;
118 Info.
Lang = SymbolLanguage::CXX;
121 Info.
Kind = SymbolKind::Enum;
break;
124 if (
const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) {
125 if (!CXXRec->isCLike()) {
126 Info.
Lang = SymbolLanguage::CXX;
127 if (CXXRec->getDescribedClassTemplate()) {
133 if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
137 }
else if (isa<ClassTemplateSpecializationDecl>(D)) {
143 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
144 Info.
Kind = SymbolKind::Variable;
145 if (isa<ParmVarDecl>(D)) {
146 Info.
Kind = SymbolKind::Parameter;
148 Info.
Kind = SymbolKind::StaticProperty;
149 Info.
Lang = SymbolLanguage::CXX;
152 if (isa<VarTemplatePartialSpecializationDecl>(D)) {
153 Info.
Lang = SymbolLanguage::CXX;
157 }
else if (isa<VarTemplateSpecializationDecl>(D)) {
158 Info.
Lang = SymbolLanguage::CXX;
162 }
else if (VD->getDescribedVarTemplate()) {
163 Info.
Lang = SymbolLanguage::CXX;
170 Info.
Kind = SymbolKind::Module;
173 Info.
Kind = SymbolKind::TypeAlias;
break;
175 Info.
Kind = SymbolKind::Function;
178 case Decl::IndirectField:
179 Info.
Kind = SymbolKind::Field;
182 if (!CXXRec->isCLike())
183 Info.
Lang = SymbolLanguage::CXX;
186 case Decl::EnumConstant:
187 Info.
Kind = SymbolKind::EnumConstant;
break;
188 case Decl::ObjCInterface:
189 case Decl::ObjCImplementation: {
190 Info.
Kind = SymbolKind::Class;
191 Info.
Lang = SymbolLanguage::ObjC;
194 ClsD = cast<ObjCImplementationDecl>(D)->getClassInterface();
199 case Decl::ObjCProtocol:
200 Info.
Kind = SymbolKind::Protocol;
201 Info.
Lang = SymbolLanguage::ObjC;
203 case Decl::ObjCCategory:
204 case Decl::ObjCCategoryImpl: {
205 Info.
Kind = SymbolKind::Extension;
206 Info.
Lang = SymbolLanguage::ObjC;
208 if (
auto *CatD = dyn_cast<ObjCCategoryDecl>(D))
209 ClsD = CatD->getClassInterface();
211 ClsD = cast<ObjCCategoryImplDecl>(D)->getClassInterface();
216 case Decl::ObjCMethod: {
221 Info.
SubKind = SymbolSubKind::AccessorSetter;
223 Info.
SubKind = SymbolSubKind::AccessorGetter;
225 Info.
Lang = SymbolLanguage::ObjC;
228 if (D->
hasAttr<IBActionAttr>())
232 case Decl::ObjCProperty:
233 Info.
Kind = SymbolKind::InstanceProperty;
234 Info.
Lang = SymbolLanguage::ObjC;
236 if (
auto *Annot = D->
getAttr<AnnotateAttr>()) {
237 if (Annot->getAnnotation() ==
"gk_inspectable")
242 Info.
Kind = SymbolKind::Field;
243 Info.
Lang = SymbolLanguage::ObjC;
246 case Decl::Namespace:
247 Info.
Kind = SymbolKind::Namespace;
248 Info.
Lang = SymbolLanguage::CXX;
250 case Decl::NamespaceAlias:
251 Info.
Kind = SymbolKind::NamespaceAlias;
252 Info.
Lang = SymbolLanguage::CXX;
254 case Decl::CXXConstructor: {
255 Info.
Kind = SymbolKind::Constructor;
256 Info.
Lang = SymbolLanguage::CXX;
257 auto *CD = cast<CXXConstructorDecl>(D);
258 if (CD->isCopyConstructor())
259 Info.
SubKind = SymbolSubKind::CXXCopyConstructor;
260 else if (CD->isMoveConstructor())
261 Info.
SubKind = SymbolSubKind::CXXMoveConstructor;
264 case Decl::CXXDestructor:
265 Info.
Kind = SymbolKind::Destructor;
266 Info.
Lang = SymbolLanguage::CXX;
268 case Decl::CXXConversion:
269 Info.
Kind = SymbolKind::ConversionFunction;
270 Info.
Lang = SymbolLanguage::CXX;
272 case Decl::CXXMethod: {
275 Info.
Kind = SymbolKind::StaticMethod;
277 Info.
Kind = SymbolKind::InstanceMethod;
278 Info.
Lang = SymbolLanguage::CXX;
281 case Decl::ClassTemplate:
282 Info.
Kind = SymbolKind::Class;
284 Info.
Lang = SymbolLanguage::CXX;
286 case Decl::FunctionTemplate:
287 Info.
Kind = SymbolKind::Function;
289 Info.
Lang = SymbolLanguage::CXX;
290 if (
const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(
291 cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) {
292 if (isa<CXXConstructorDecl>(MD))
293 Info.
Kind = SymbolKind::Constructor;
294 else if (isa<CXXDestructorDecl>(MD))
295 Info.
Kind = SymbolKind::Destructor;
296 else if (isa<CXXConversionDecl>(MD))
297 Info.
Kind = SymbolKind::ConversionFunction;
300 Info.
Kind = SymbolKind::StaticMethod;
302 Info.
Kind = SymbolKind::InstanceMethod;
306 case Decl::TypeAliasTemplate:
307 Info.
Kind = SymbolKind::TypeAlias;
308 Info.
Lang = SymbolLanguage::CXX;
311 case Decl::TypeAlias:
312 Info.
Kind = SymbolKind::TypeAlias;
313 Info.
Lang = SymbolLanguage::CXX;
315 case Decl::UnresolvedUsingTypename:
316 Info.
Kind = SymbolKind::Using;
317 Info.
SubKind = SymbolSubKind::UsingTypename;
318 Info.
Lang = SymbolLanguage::CXX;
321 case Decl::UnresolvedUsingValue:
322 Info.
Kind = SymbolKind::Using;
323 Info.
SubKind = SymbolSubKind::UsingValue;
324 Info.
Lang = SymbolLanguage::CXX;
328 Info.
Kind = SymbolKind::Using;
329 Info.
Lang = SymbolLanguage::CXX;
331 case Decl::UsingEnum:
332 Info.
Kind = SymbolKind::Using;
333 Info.
Lang = SymbolLanguage::CXX;
334 Info.
SubKind = SymbolSubKind::UsingEnum;
337 Info.
Kind = SymbolKind::Variable;
338 Info.
Lang = SymbolLanguage::CXX;
340 case Decl::MSProperty:
341 Info.
Kind = SymbolKind::InstanceProperty;
344 if (!CXXRec->isCLike())
345 Info.
Lang = SymbolLanguage::CXX;
348 case Decl::ClassTemplatePartialSpecialization:
349 case Decl::ClassScopeFunctionSpecialization:
350 case Decl::ClassTemplateSpecialization:
351 case Decl::CXXRecord:
354 llvm_unreachable(
"records handled before");
356 case Decl::VarTemplateSpecialization:
357 case Decl::VarTemplatePartialSpecialization:
358 case Decl::ImplicitParam:
361 case Decl::VarTemplate:
362 llvm_unreachable(
"variables handled before");
364 case Decl::TemplateTypeParm:
365 Info.
Kind = SymbolKind::TemplateTypeParm;
367 case Decl::TemplateTemplateParm:
368 Info.
Kind = SymbolKind::TemplateTemplateParm;
370 case Decl::NonTypeTemplateParm:
371 Info.
Kind = SymbolKind::NonTypeTemplateParm;
374 Info.
Kind = SymbolKind::Concept;
382 if (Info.Kind == SymbolKind::Unknown)
385 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
386 if (FD->getTemplatedKind() ==
395 Info.Lang = SymbolLanguage::CXX;
397 if (
auto *attr = D->getExternalSourceSymbolAttr()) {
398 if (
attr->getLanguage() ==
"Swift")
399 Info.Lang = SymbolLanguage::Swift;
407 Info.
Kind = SymbolKind::Macro;
408 Info.
SubKind = SymbolSubKind::None;
410 Info.
Lang = SymbolLanguage::C;
416#define APPLY_FOR_ROLE(Role) \
417 if (Roles & (unsigned)SymbolRole::Role) \
418 if (!Fn(SymbolRole::Role)) \
457 bool VisitedOnce =
false;
464 case SymbolRole::Declaration: OS <<
"Decl";
break;
465 case SymbolRole::Definition: OS <<
"Def";
break;
466 case SymbolRole::Reference: OS <<
"Ref";
break;
467 case SymbolRole::Read: OS <<
"Read";
break;
468 case SymbolRole::Write: OS <<
"Writ";
break;
469 case SymbolRole::Call: OS <<
"Call";
break;
470 case SymbolRole::Dynamic: OS <<
"Dyn";
break;
471 case SymbolRole::AddressOf: OS <<
"Addr";
break;
472 case SymbolRole::Implicit: OS <<
"Impl";
break;
473 case SymbolRole::Undefinition: OS <<
"Undef";
break;
474 case SymbolRole::RelationChildOf: OS <<
"RelChild";
break;
475 case SymbolRole::RelationBaseOf: OS <<
"RelBase";
break;
476 case SymbolRole::RelationOverrideOf: OS <<
"RelOver";
break;
477 case SymbolRole::RelationReceivedBy: OS <<
"RelRec";
break;
478 case SymbolRole::RelationCalledBy: OS <<
"RelCall";
break;
479 case SymbolRole::RelationExtendedBy: OS <<
"RelExt";
break;
480 case SymbolRole::RelationAccessorOf: OS <<
"RelAcc";
break;
481 case SymbolRole::RelationContainedBy: OS <<
"RelCont";
break;
482 case SymbolRole::RelationIBTypeOf: OS <<
"RelIBType";
break;
483 case SymbolRole::RelationSpecializationOf: OS <<
"RelSpecialization";
break;
484 case SymbolRole::NameReference: OS <<
"NameReference";
break;
491 if (
auto *ND = dyn_cast<NamedDecl>(D)) {
500 DeclName.
print(OS, Policy);
509 case SymbolKind::Unknown:
return "<unknown>";
510 case SymbolKind::Module:
return "module";
511 case SymbolKind::Namespace:
return "namespace";
512 case SymbolKind::NamespaceAlias:
return "namespace-alias";
513 case SymbolKind::Macro:
return "macro";
514 case SymbolKind::Enum:
return "enum";
515 case SymbolKind::Struct:
return "struct";
516 case SymbolKind::Class:
return "class";
517 case SymbolKind::Protocol:
return "protocol";
518 case SymbolKind::Extension:
return "extension";
519 case SymbolKind::Union:
return "union";
520 case SymbolKind::TypeAlias:
return "type-alias";
521 case SymbolKind::Function:
return "function";
522 case SymbolKind::Variable:
return "variable";
523 case SymbolKind::Field:
return "field";
524 case SymbolKind::EnumConstant:
return "enumerator";
525 case SymbolKind::InstanceMethod:
return "instance-method";
526 case SymbolKind::ClassMethod:
return "class-method";
527 case SymbolKind::StaticMethod:
return "static-method";
528 case SymbolKind::InstanceProperty:
return "instance-property";
529 case SymbolKind::ClassProperty:
return "class-property";
530 case SymbolKind::StaticProperty:
return "static-property";
531 case SymbolKind::Constructor:
return "constructor";
532 case SymbolKind::Destructor:
return "destructor";
533 case SymbolKind::ConversionFunction:
return "conversion-func";
534 case SymbolKind::Parameter:
return "param";
535 case SymbolKind::Using:
return "using";
536 case SymbolKind::TemplateTypeParm:
return "template-type-param";
537 case SymbolKind::TemplateTemplateParm:
return "template-template-param";
538 case SymbolKind::NonTypeTemplateParm:
return "non-type-template-param";
539 case SymbolKind::Concept:
542 llvm_unreachable(
"invalid symbol kind");
547 case SymbolSubKind::None:
return "<none>";
548 case SymbolSubKind::CXXCopyConstructor:
return "cxx-copy-ctor";
549 case SymbolSubKind::CXXMoveConstructor:
return "cxx-move-ctor";
550 case SymbolSubKind::AccessorGetter:
return "acc-get";
551 case SymbolSubKind::AccessorSetter:
return "acc-set";
552 case SymbolSubKind::UsingTypename:
return "using-typename";
553 case SymbolSubKind::UsingValue:
return "using-value";
554 case SymbolSubKind::UsingEnum:
557 llvm_unreachable(
"invalid symbol subkind");
562 case SymbolLanguage::C:
return "C";
563 case SymbolLanguage::ObjC:
return "ObjC";
564 case SymbolLanguage::CXX:
return "C++";
565 case SymbolLanguage::Swift:
return "Swift";
567 llvm_unreachable(
"invalid symbol language kind");
572#define APPLY_FOR_PROPERTY(K) \
573 if (Props & (SymbolPropertySet)SymbolProperty::K) \
574 Fn(SymbolProperty::K)
586#undef APPLY_FOR_PROPERTY
590 bool VisitedOnce =
false;
597 case SymbolProperty::Generic: OS <<
"Gen";
break;
598 case SymbolProperty::TemplatePartialSpecialization: OS <<
"TPS";
break;
599 case SymbolProperty::TemplateSpecialization: OS <<
"TS";
break;
600 case SymbolProperty::UnitTest: OS <<
"test";
break;
601 case SymbolProperty::IBAnnotated: OS <<
"IB";
break;
602 case SymbolProperty::IBOutletCollection: OS <<
"IBColl";
break;
603 case SymbolProperty::GKInspectable: OS <<
"GKI";
break;
604 case SymbolProperty::Local: OS <<
"local";
break;
605 case SymbolProperty::ProtocolInterface: OS <<
"protocol";
break;
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
#define APPLY_FOR_PROPERTY(K)
static bool isUnitTest(const ObjCMethodDecl *D)
#define APPLY_FOR_ROLE(Role)
static void checkForIBOutlets(const Decl *D, SymbolPropertySet &PropSet)
static bool isUnitTestCase(const ObjCInterfaceDecl *D)
Defines the clang::MacroInfo and clang::MacroDirective classes.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
Decl - This represents one declaration (or definition), e.g.
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
DeclContext * getDeclContext()
The name of a declaration.
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
bool isEmpty() const
Evaluates true when this declaration name is empty.
Represents a function declaration or definition.
@ TK_FunctionTemplateSpecialization
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Encapsulates the data about a macro definition (e.g.
This represents a decl that may have a name.
Represents an ObjC class declaration.
ObjCInterfaceDecl * getSuperClass() const
ObjCMethodDecl - Represents an instance or class method declaration.
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
bool isPropertyAccessor() const
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
ObjCInterfaceDecl * getClassInterface()
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
Represents the declaration of a struct/union/class/enum.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
void applyForEachSymbolProperty(SymbolPropertySet Props, llvm::function_ref< void(SymbolProperty)> Fn)
SymbolRole
Set of roles that are attributed to symbol occurrences.
@ RelationSpecializationOf
StringRef getSymbolSubKindString(SymbolSubKind K)
void printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS)
SymbolInfo getSymbolInfo(const Decl *D)
StringRef getSymbolKindString(SymbolKind K)
bool isFunctionLocalSymbol(const Decl *D)
void applyForEachSymbolRole(SymbolRoleSet Roles, llvm::function_ref< void(SymbolRole)> Fn)
void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS)
SymbolInfo getSymbolInfoForMacro(const MacroInfo &MI)
bool printSymbolName(const Decl *D, const LangOptions &LO, raw_ostream &OS)
bool applyForEachSymbolRoleInterruptible(SymbolRoleSet Roles, llvm::function_ref< bool(SymbolRole)> Fn)
SymbolProperty
Set of properties that provide additional info about a symbol.
@ TemplatePartialSpecialization
@ ProtocolInterface
Symbol is part of a protocol interface.
uint16_t SymbolPropertySet
StringRef getSymbolLanguageString(SymbolLanguage K)
SymbolSubKind
Language specific sub-kinds.
@ InternalLinkage
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ ModuleLinkage
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ NoLinkage
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ ExternalLinkage
External linkage, which indicates that the entity can be referred to from other translation units.
@ UniqueExternalLinkage
External linkage within a unique namespace.
@ VisibleNoLinkage
No linkage according to the standard, but is visible from other translation units because of types de...
@ TTK_Class
The "class" keyword.
@ TTK_Enum
The "enum" keyword.
@ TTK_Struct
The "struct" keyword.
@ TTK_Union
The "union" keyword.
@ TTK_Interface
The "__interface" keyword.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T -> getSizeExpr()))
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressTemplateArgsInCXXConstructors
When true, suppresses printing template arguments in names of C++ constructors.
SymbolPropertySet Properties