20#include "llvm/ADT/StringRef.h"
28template <
typename RecordTy,
typename... CtorArgsTy>
29RecordTy *addTopLevelRecord(DenseMap<StringRef, APIRecord *> &USRLookupTable,
31 StringRef USR, CtorArgsTy &&...CtorArgs) {
32 auto Result = RecordMap.insert({USR,
nullptr});
36 Result.first->second =
37 std::make_unique<RecordTy>(USR, std::forward<CtorArgsTy>(CtorArgs)...);
39 auto *
Record = Result.first->second.get();
40 USRLookupTable.insert({USR,
Record});
52 auto *Record = addTopLevelRecord(
53 USRBasedLookupTable, Namespaces, USR, Name, Loc, std::move(Availability),
67 return addTopLevelRecord(USRBasedLookupTable, GlobalVariables, USR, Name, Loc,
68 std::move(Availabilities),
Linkage, Comment,
69 Fragments, SubHeading, IsFromSystemHeader);
77 bool IsFromSystemHeader) {
78 return addTopLevelRecord(USRBasedLookupTable, GlobalVariableTemplates, USR,
79 Name, Loc, std::move(Availability),
Linkage, Comment,
89 bool IsFromSystemHeader) {
90 return addTopLevelRecord(USRBasedLookupTable, GlobalFunctions, USR, Name, Loc,
91 std::move(Availabilities),
Linkage, Comment,
92 Fragments, SubHeading, Signature,
102 return addTopLevelRecord(USRBasedLookupTable, GlobalFunctionTemplates, USR,
103 Name, Loc, std::move(Availability),
Linkage, Comment,
114 bool IsFromSystemHeader) {
115 return addTopLevelRecord(
116 USRBasedLookupTable, GlobalFunctionTemplateSpecializations, USR, Name,
118 Signature, IsFromSystemHeader);
127 bool IsFromSystemHeader) {
128 auto Record = std::make_unique<EnumConstantRecord>(
129 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
130 SubHeading, IsFromSystemHeader);
133 USRBasedLookupTable.insert({USR, Record.get()});
134 return Enum->Constants.emplace_back(std::move(Record)).get();
142 bool IsFromSystemHeader) {
143 return addTopLevelRecord(USRBasedLookupTable, Enums, USR, Name, Loc,
145 SubHeading, IsFromSystemHeader);
154 bool IsFromSystemHeader) {
155 auto Record = std::make_unique<StructFieldRecord>(
156 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
157 SubHeading, IsFromSystemHeader);
160 USRBasedLookupTable.insert({USR, Record.get()});
161 return Struct->Fields.emplace_back(std::move(Record)).get();
169 bool IsFromSystemHeader) {
170 return addTopLevelRecord(USRBasedLookupTable, Structs, USR, Name, Loc,
172 SubHeading, IsFromSystemHeader);
182 return addTopLevelRecord(USRBasedLookupTable, StaticFields, USR, Name, Loc,
183 std::move(Availabilities),
Linkage, Comment,
193 bool IsFromSystemHeader) {
194 auto *Record = addTopLevelRecord(
195 USRBasedLookupTable, CXXFields, USR, Name, Loc, std::move(Availabilities),
196 Comment,
Declaration, SubHeading, Access, IsFromSystemHeader);
208 addTopLevelRecord(USRBasedLookupTable, CXXFieldTemplates, USR, Name, Loc,
210 SubHeading, Access,
Template, IsFromSystemHeader);
224 addTopLevelRecord(USRBasedLookupTable, CXXClasses, USR, Name, Loc,
226 SubHeading, Kind, Access, IsFromSystemHeader);
239 addTopLevelRecord(USRBasedLookupTable, ClassTemplates, USR, Name, Loc,
241 SubHeading,
Template, Access, IsFromSystemHeader);
254 addTopLevelRecord(USRBasedLookupTable, ClassTemplateSpecializations, USR,
255 Name, Loc, std::move(Availability), Comment,
256 Declaration, SubHeading, Access, IsFromSystemHeader);
269 auto *Record = addTopLevelRecord(
270 USRBasedLookupTable, ClassTemplatePartialSpecializations, USR, Name, Loc,
272 Access, IsFromSystemHeader);
285 return addTopLevelRecord(USRBasedLookupTable,
286 GlobalVariableTemplateSpecializations, USR, Name,
287 Loc, std::move(Availability),
Linkage, Comment,
297 bool IsFromSystemHeader) {
298 return addTopLevelRecord(
299 USRBasedLookupTable, GlobalVariableTemplatePartialSpecializations, USR,
301 SubHeading,
Template, IsFromSystemHeader);
310 return addTopLevelRecord(USRBasedLookupTable, Concepts, USR, Name, Loc,
312 SubHeading,
Template, IsFromSystemHeader);
320 bool IsFromSystemHeader) {
322 addTopLevelRecord(USRBasedLookupTable, CXXInstanceMethods, USR, Name, Loc,
324 SubHeading, Signature, Access, IsFromSystemHeader);
337 bool IsFromSystemHeader) {
339 addTopLevelRecord(USRBasedLookupTable, CXXStaticMethods, USR, Name, Loc,
341 SubHeading, Signature, Access, IsFromSystemHeader);
354 bool IsFromSystemHeader) {
355 auto *Record = addTopLevelRecord(USRBasedLookupTable, CXXMethodTemplates, USR,
356 Name, Loc, std::move(Availability), Comment,
370 bool IsFromSystemHeader) {
372 auto *Record = addTopLevelRecord(
373 USRBasedLookupTable, CXXMethodTemplateSpecializations, USR, Name, Loc,
374 std::move(Availability), Comment,
Declaration, SubHeading, Signature,
375 Access, IsFromSystemHeader);
387 bool IsFromExternalModule) {
390 addTopLevelRecord(USRBasedLookupTable, ObjCCategories, USR, Name, Loc,
392 SubHeading,
Interface, IsFromSystemHeader);
394 Record->IsFromExternalModule = IsFromExternalModule;
396 auto It = ObjCInterfaces.find(
Interface.USR);
397 if (It != ObjCInterfaces.end())
398 It->second->Categories.push_back(Record);
410 return addTopLevelRecord(USRBasedLookupTable, ObjCInterfaces, USR, Name, Loc,
411 std::move(Availabilities),
Linkage, Comment,
421 bool IsFromSystemHeader) {
422 std::unique_ptr<ObjCMethodRecord> Record;
423 if (IsInstanceMethod)
424 Record = std::make_unique<ObjCInstanceMethodRecord>(
425 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
426 SubHeading, Signature, IsFromSystemHeader);
428 Record = std::make_unique<ObjCClassMethodRecord>(
429 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
430 SubHeading, Signature, IsFromSystemHeader);
433 Container->USR, Container->Name, Container->getKind(), Container);
434 USRBasedLookupTable.insert({USR, Record.get()});
435 return Container->Methods.emplace_back(std::move(Record)).get();
443 StringRef SetterName,
bool IsOptional,
bool IsInstanceProperty,
444 bool IsFromSystemHeader) {
445 std::unique_ptr<ObjCPropertyRecord> Record;
446 if (IsInstanceProperty)
447 Record = std::make_unique<ObjCInstancePropertyRecord>(
448 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
449 SubHeading, Attributes, GetterName, SetterName, IsOptional,
452 Record = std::make_unique<ObjCClassPropertyRecord>(
453 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
454 SubHeading, Attributes, GetterName, SetterName, IsOptional,
457 Container->USR, Container->Name, Container->getKind(), Container);
458 USRBasedLookupTable.insert({USR, Record.get()});
459 return Container->Properties.emplace_back(std::move(Record)).get();
467 auto Record = std::make_unique<ObjCInstanceVariableRecord>(
468 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
469 SubHeading, Access, IsFromSystemHeader);
471 Container->USR, Container->Name, Container->getKind(), Container);
472 USRBasedLookupTable.insert({USR, Record.get()});
473 return Container->Ivars.emplace_back(std::move(Record)).get();
482 bool IsFromSystemHeader) {
483 return addTopLevelRecord(USRBasedLookupTable, ObjCProtocols, USR, Name, Loc,
485 SubHeading, IsFromSystemHeader);
492 bool IsFromSystemHeader) {
493 return addTopLevelRecord(USRBasedLookupTable, Macros, USR, Name, Loc,
503 return addTopLevelRecord(USRBasedLookupTable, Typedefs, USR, Name, Loc,
505 SubHeading, UnderlyingType, IsFromSystemHeader);
512 return USRBasedLookupTable.lookup(USR);
533 if (StringAllocator.identifyObject(String.data()))
536 void *Ptr = StringAllocator.Allocate(String.size(), 1);
537 memcpy(Ptr, String.data(), String.size());
538 return StringRef(
reinterpret_cast<const char *
>(Ptr), String.size());
547void GlobalFunctionRecord::anchor() {}
548void GlobalVariableRecord::anchor() {}
549void EnumConstantRecord::anchor() {}
550void EnumRecord::anchor() {}
551void StructFieldRecord::anchor() {}
552void StructRecord::anchor() {}
553void CXXFieldRecord::anchor() {}
554void CXXClassRecord::anchor() {}
555void CXXConstructorRecord::anchor() {}
556void CXXDestructorRecord::anchor() {}
557void CXXInstanceMethodRecord::anchor() {}
558void CXXStaticMethodRecord::anchor() {}
559void ObjCInstancePropertyRecord::anchor() {}
560void ObjCClassPropertyRecord::anchor() {}
561void ObjCInstanceVariableRecord::anchor() {}
562void ObjCInstanceMethodRecord::anchor() {}
563void ObjCClassMethodRecord::anchor() {}
564void ObjCCategoryRecord::anchor() {}
565void ObjCInterfaceRecord::anchor() {}
566void ObjCProtocolRecord::anchor() {}
567void MacroDefinitionRecord::anchor() {}
568void TypedefRecord::anchor() {}
This file defines the APIRecord-based structs and the APISet class.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Decl - This represents one declaration (or definition), e.g.
Represents an unpacked "presumed" location which can be presented to the user.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
bool generateUSRForMacro(const MacroDefinitionRecord *MD, const SourceManager &SM, SmallVectorImpl< char > &Buf)
Generate a USR for a macro, including the USR prefix.
bool generateUSRForDecl(const Decl *D, SmallVectorImpl< char > &Buf)
Generate a USR for a Decl, including the USR prefix.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
YAML serialization mapping.