20#include "llvm/ADT/STLFunctionalExtras.h"
21#include "llvm/ADT/StringRef.h"
29template <
typename RecordTy,
typename... CtorArgsTy>
30RecordTy *addTopLevelRecord(DenseMap<StringRef, APIRecord *> &USRLookupTable,
32 StringRef USR, CtorArgsTy &&...CtorArgs) {
33 auto Result = RecordMap.insert({USR,
nullptr});
37 Result.first->second =
38 std::make_unique<RecordTy>(USR, std::forward<CtorArgsTy>(CtorArgs)...);
40 auto *
Record = Result.first->second.get();
41 USRLookupTable.insert({USR,
Record});
52 return addTopLevelRecord(USRBasedLookupTable, GlobalVariables, USR, Name, Loc,
53 std::move(Availabilities),
Linkage, Comment,
54 Fragments, SubHeading, IsFromSystemHeader);
62 bool IsFromSystemHeader) {
63 return addTopLevelRecord(USRBasedLookupTable, GlobalFunctions, USR, Name, Loc,
64 std::move(Availabilities),
Linkage, Comment,
65 Fragments, SubHeading, Signature,
75 bool IsFromSystemHeader) {
76 auto Record = std::make_unique<EnumConstantRecord>(
77 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
78 SubHeading, IsFromSystemHeader);
81 USRBasedLookupTable.insert({USR, Record.get()});
82 return Enum->Constants.emplace_back(std::move(Record)).get();
90 bool IsFromSystemHeader) {
91 return addTopLevelRecord(USRBasedLookupTable, Enums, USR, Name, Loc,
93 SubHeading, IsFromSystemHeader);
102 bool IsFromSystemHeader) {
103 auto Record = std::make_unique<StructFieldRecord>(
104 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
105 SubHeading, IsFromSystemHeader);
107 Struct->USR, Struct->Name, Struct->getKind(), Struct);
108 USRBasedLookupTable.insert({USR, Record.get()});
109 return Struct->Fields.emplace_back(std::move(Record)).get();
117 bool IsFromSystemHeader) {
118 return addTopLevelRecord(USRBasedLookupTable, Structs, USR, Name, Loc,
120 SubHeading, IsFromSystemHeader);
130 addTopLevelRecord(USRBasedLookupTable, ObjCCategories, USR, Name, Loc,
132 SubHeading, Interface, IsFromSystemHeader);
136 auto It = ObjCInterfaces.find(Interface.
USR);
137 if (It != ObjCInterfaces.end())
138 It->second->Categories.push_back(Record);
150 return addTopLevelRecord(USRBasedLookupTable, ObjCInterfaces, USR, Name, Loc,
151 std::move(Availabilities),
Linkage, Comment,
161 bool IsFromSystemHeader) {
162 std::unique_ptr<ObjCMethodRecord> Record;
163 if (IsInstanceMethod)
164 Record = std::make_unique<ObjCInstanceMethodRecord>(
165 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
166 SubHeading, Signature, IsFromSystemHeader);
168 Record = std::make_unique<ObjCClassMethodRecord>(
169 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
170 SubHeading, Signature, IsFromSystemHeader);
173 Container->USR, Container->Name, Container->getKind(), Container);
174 USRBasedLookupTable.insert({USR, Record.get()});
175 return Container->Methods.emplace_back(std::move(Record)).get();
183 StringRef SetterName,
bool IsOptional,
bool IsInstanceProperty,
184 bool IsFromSystemHeader) {
185 std::unique_ptr<ObjCPropertyRecord> Record;
186 if (IsInstanceProperty)
187 Record = std::make_unique<ObjCInstancePropertyRecord>(
188 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
189 SubHeading, Attributes, GetterName, SetterName, IsOptional,
192 Record = std::make_unique<ObjCClassPropertyRecord>(
193 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
194 SubHeading, Attributes, GetterName, SetterName, IsOptional,
197 Container->USR, Container->Name, Container->getKind(), Container);
198 USRBasedLookupTable.insert({USR, Record.get()});
199 return Container->Properties.emplace_back(std::move(Record)).get();
207 auto Record = std::make_unique<ObjCInstanceVariableRecord>(
208 USR, Name, Loc, std::move(Availabilities), Comment,
Declaration,
209 SubHeading, Access, IsFromSystemHeader);
211 Container->USR, Container->Name, Container->getKind(), Container);
212 USRBasedLookupTable.insert({USR, Record.get()});
213 return Container->Ivars.emplace_back(std::move(Record)).get();
222 bool IsFromSystemHeader) {
223 return addTopLevelRecord(USRBasedLookupTable, ObjCProtocols, USR, Name, Loc,
225 SubHeading, IsFromSystemHeader);
232 bool IsFromSystemHeader) {
233 return addTopLevelRecord(USRBasedLookupTable, Macros, USR, Name, Loc,
243 return addTopLevelRecord(USRBasedLookupTable, Typedefs, USR, Name, Loc,
245 SubHeading, UnderlyingType, IsFromSystemHeader);
252 auto It = USRBasedLookupTable.find(USR);
253 if (It != USRBasedLookupTable.end())
276 if (StringAllocator.identifyObject(String.data()))
279 void *Ptr = StringAllocator.Allocate(String.size(), 1);
280 memcpy(Ptr, String.data(), String.size());
281 return StringRef(
reinterpret_cast<const char *
>(Ptr), String.size());
289void GlobalFunctionRecord::anchor() {}
290void GlobalVariableRecord::anchor() {}
291void EnumConstantRecord::anchor() {}
292void EnumRecord::anchor() {}
293void StructFieldRecord::anchor() {}
294void StructRecord::anchor() {}
295void ObjCInstancePropertyRecord::anchor() {}
296void ObjCClassPropertyRecord::anchor() {}
297void ObjCInstanceVariableRecord::anchor() {}
298void ObjCInstanceMethodRecord::anchor() {}
299void ObjCClassMethodRecord::anchor() {}
300void ObjCCategoryRecord::anchor() {}
301void ObjCInterfaceRecord::anchor() {}
302void ObjCProtocolRecord::anchor() {}
303void MacroDefinitionRecord::anchor() {}
304void 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.
YAML serialization mapping.