25 if (SuperD->getName() ==
"XCTestCase")
35 if (!
D->parameters().empty())
37 if (!
D->getReturnType()->isVoidType())
39 if (!
D->getSelector().getNameForSlot(0).starts_with(
"test"))
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()) {
69 case Linkage::Invalid:
70 llvm_unreachable(
"Linkage hasn't been computed!");
72 case Linkage::Internal:
74 case Linkage::VisibleNone:
75 case Linkage::UniqueExternal:
76 llvm_unreachable(
"Not a sema linkage");
78 case Linkage::External:
89 Info.
Kind = SymbolKind::Unknown;
90 Info.
SubKind = SymbolSubKind::None;
92 Info.
Lang = SymbolLanguage::C;
101 if (
auto *VT = dyn_cast<VarTemplateDecl>(
D)) {
103 Info.
Lang = SymbolLanguage::CXX;
105 D = VT->getTemplatedDecl();
108 if (
const TagDecl *TD = dyn_cast<TagDecl>(
D)) {
109 switch (TD->getTagKind()) {
110 case TagTypeKind::Struct:
111 Info.
Kind = SymbolKind::Struct;
break;
112 case TagTypeKind::Union:
113 Info.
Kind = SymbolKind::Union;
break;
114 case TagTypeKind::Class:
115 Info.
Kind = SymbolKind::Class;
116 Info.
Lang = SymbolLanguage::CXX;
118 case TagTypeKind::Interface:
119 Info.
Kind = SymbolKind::Protocol;
120 Info.
Lang = SymbolLanguage::CXX;
122 case TagTypeKind::Enum:
123 Info.
Kind = SymbolKind::Enum;
break;
127 if (!CXXRec->isCLike()) {
128 Info.
Lang = SymbolLanguage::CXX;
129 if (CXXRec->getDescribedClassTemplate()) {
135 if (isa<ClassTemplatePartialSpecializationDecl>(
D)) {
139 }
else if (isa<ClassTemplateSpecializationDecl>(
D)) {
145 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
146 Info.
Kind = SymbolKind::Variable;
147 if (isa<ParmVarDecl>(
D)) {
148 Info.
Kind = SymbolKind::Parameter;
150 Info.
Kind = SymbolKind::StaticProperty;
151 Info.
Lang = SymbolLanguage::CXX;
154 if (isa<VarTemplatePartialSpecializationDecl>(
D)) {
155 Info.
Lang = SymbolLanguage::CXX;
159 }
else if (isa<VarTemplateSpecializationDecl>(
D)) {
160 Info.
Lang = SymbolLanguage::CXX;
164 }
else if (VD->getDescribedVarTemplate()) {
165 Info.
Lang = SymbolLanguage::CXX;
172 Info.
Kind = SymbolKind::Module;
175 Info.
Kind = SymbolKind::TypeAlias;
break;
177 Info.
Kind = SymbolKind::Function;
180 case Decl::IndirectField:
181 Info.
Kind = SymbolKind::Field;
184 if (!CXXRec->isCLike())
185 Info.
Lang = SymbolLanguage::CXX;
188 case Decl::EnumConstant:
189 Info.
Kind = SymbolKind::EnumConstant;
break;
190 case Decl::ObjCInterface:
191 case Decl::ObjCImplementation: {
192 Info.
Kind = SymbolKind::Class;
193 Info.
Lang = SymbolLanguage::ObjC;
196 ClsD = cast<ObjCImplementationDecl>(
D)->getClassInterface();
201 case Decl::ObjCProtocol:
202 Info.
Kind = SymbolKind::Protocol;
203 Info.
Lang = SymbolLanguage::ObjC;
205 case Decl::ObjCCategory:
206 case Decl::ObjCCategoryImpl: {
207 Info.
Kind = SymbolKind::Extension;
208 Info.
Lang = SymbolLanguage::ObjC;
210 if (
auto *CatD = dyn_cast<ObjCCategoryDecl>(
D))
211 ClsD = CatD->getClassInterface();
213 ClsD = cast<ObjCCategoryImplDecl>(
D)->getClassInterface();
218 case Decl::ObjCMethod: {
223 Info.
SubKind = SymbolSubKind::AccessorSetter;
225 Info.
SubKind = SymbolSubKind::AccessorGetter;
227 Info.
Lang = SymbolLanguage::ObjC;
234 case Decl::ObjCProperty:
235 Info.
Kind = SymbolKind::InstanceProperty;
236 Info.
Lang = SymbolLanguage::ObjC;
238 if (
auto *Annot =
D->
getAttr<AnnotateAttr>()) {
239 if (Annot->getAnnotation() ==
"gk_inspectable")
244 Info.
Kind = SymbolKind::Field;
245 Info.
Lang = SymbolLanguage::ObjC;
248 case Decl::Namespace:
249 Info.
Kind = SymbolKind::Namespace;
250 Info.
Lang = SymbolLanguage::CXX;
252 case Decl::NamespaceAlias:
253 Info.
Kind = SymbolKind::NamespaceAlias;
254 Info.
Lang = SymbolLanguage::CXX;
256 case Decl::CXXConstructor: {
257 Info.
Kind = SymbolKind::Constructor;
258 Info.
Lang = SymbolLanguage::CXX;
259 auto *CD = cast<CXXConstructorDecl>(
D);
260 if (CD->isCopyConstructor())
261 Info.
SubKind = SymbolSubKind::CXXCopyConstructor;
262 else if (CD->isMoveConstructor())
263 Info.
SubKind = SymbolSubKind::CXXMoveConstructor;
266 case Decl::CXXDestructor:
267 Info.
Kind = SymbolKind::Destructor;
268 Info.
Lang = SymbolLanguage::CXX;
270 case Decl::CXXConversion:
271 Info.
Kind = SymbolKind::ConversionFunction;
272 Info.
Lang = SymbolLanguage::CXX;
274 case Decl::CXXMethod: {
277 Info.
Kind = SymbolKind::StaticMethod;
279 Info.
Kind = SymbolKind::InstanceMethod;
280 Info.
Lang = SymbolLanguage::CXX;
283 case Decl::ClassTemplate:
284 Info.
Kind = SymbolKind::Class;
286 Info.
Lang = SymbolLanguage::CXX;
288 case Decl::FunctionTemplate:
289 Info.
Kind = SymbolKind::Function;
291 Info.
Lang = SymbolLanguage::CXX;
292 if (
const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(
293 cast<FunctionTemplateDecl>(
D)->getTemplatedDecl())) {
294 if (isa<CXXConstructorDecl>(MD))
295 Info.
Kind = SymbolKind::Constructor;
296 else if (isa<CXXDestructorDecl>(MD))
297 Info.
Kind = SymbolKind::Destructor;
298 else if (isa<CXXConversionDecl>(MD))
299 Info.
Kind = SymbolKind::ConversionFunction;
302 Info.
Kind = SymbolKind::StaticMethod;
304 Info.
Kind = SymbolKind::InstanceMethod;
308 case Decl::TypeAliasTemplate:
309 Info.
Kind = SymbolKind::TypeAlias;
310 Info.
Lang = SymbolLanguage::CXX;
313 case Decl::TypeAlias:
314 Info.
Kind = SymbolKind::TypeAlias;
315 Info.
Lang = SymbolLanguage::CXX;
317 case Decl::UnresolvedUsingTypename: