181ad6265SDimitry Andric //===- ExtractAPI/API.cpp ---------------------------------------*- C++ -*-===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric ///
981ad6265SDimitry Andric /// \file
1081ad6265SDimitry Andric /// This file implements the APIRecord and derived record structs,
1181ad6265SDimitry Andric /// and the APISet class.
1281ad6265SDimitry Andric ///
1381ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric
1581ad6265SDimitry Andric #include "clang/ExtractAPI/API.h"
1681ad6265SDimitry Andric #include "clang/AST/CommentCommandTraits.h"
1781ad6265SDimitry Andric #include "clang/AST/CommentLexer.h"
1881ad6265SDimitry Andric #include "clang/AST/RawCommentList.h"
1981ad6265SDimitry Andric #include "clang/Index/USRGeneration.h"
2081ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
2181ad6265SDimitry Andric #include <memory>
2281ad6265SDimitry Andric
2381ad6265SDimitry Andric using namespace clang::extractapi;
2481ad6265SDimitry Andric using namespace llvm;
2581ad6265SDimitry Andric
2681ad6265SDimitry Andric namespace {
2781ad6265SDimitry Andric
2881ad6265SDimitry Andric template <typename RecordTy, typename... CtorArgsTy>
addTopLevelRecord(DenseMap<StringRef,APIRecord * > & USRLookupTable,APISet::RecordMap<RecordTy> & RecordMap,StringRef USR,CtorArgsTy &&...CtorArgs)29bdd1243dSDimitry Andric RecordTy *addTopLevelRecord(DenseMap<StringRef, APIRecord *> &USRLookupTable,
30bdd1243dSDimitry Andric APISet::RecordMap<RecordTy> &RecordMap,
3181ad6265SDimitry Andric StringRef USR, CtorArgsTy &&...CtorArgs) {
3281ad6265SDimitry Andric auto Result = RecordMap.insert({USR, nullptr});
3381ad6265SDimitry Andric
3481ad6265SDimitry Andric // Create the record if it does not already exist
3581ad6265SDimitry Andric if (Result.second)
3681ad6265SDimitry Andric Result.first->second =
3781ad6265SDimitry Andric std::make_unique<RecordTy>(USR, std::forward<CtorArgsTy>(CtorArgs)...);
3881ad6265SDimitry Andric
39bdd1243dSDimitry Andric auto *Record = Result.first->second.get();
40bdd1243dSDimitry Andric USRLookupTable.insert({USR, Record});
41bdd1243dSDimitry Andric return Record;
4281ad6265SDimitry Andric }
4381ad6265SDimitry Andric
4481ad6265SDimitry Andric } // namespace
4581ad6265SDimitry Andric
46c9157d92SDimitry Andric NamespaceRecord *
addNamespace(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)47c9157d92SDimitry Andric APISet::addNamespace(APIRecord *Parent, StringRef Name, StringRef USR,
48*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability,
49c9157d92SDimitry Andric LinkageInfo Linkage, const DocComment &Comment,
50c9157d92SDimitry Andric DeclarationFragments Declaration,
51c9157d92SDimitry Andric DeclarationFragments SubHeading, bool IsFromSystemHeader) {
52c9157d92SDimitry Andric auto *Record = addTopLevelRecord(
53c9157d92SDimitry Andric USRBasedLookupTable, Namespaces, USR, Name, Loc, std::move(Availability),
54c9157d92SDimitry Andric Linkage, Comment, Declaration, SubHeading, IsFromSystemHeader);
55c9157d92SDimitry Andric
56c9157d92SDimitry Andric if (Parent)
57c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
58c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
59c9157d92SDimitry Andric return Record;
60c9157d92SDimitry Andric }
61c9157d92SDimitry Andric
6281ad6265SDimitry Andric GlobalVariableRecord *
addGlobalVar(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Fragments,DeclarationFragments SubHeading,bool IsFromSystemHeader)6381ad6265SDimitry Andric APISet::addGlobalVar(StringRef Name, StringRef USR, PresumedLoc Loc,
64*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
6581ad6265SDimitry Andric const DocComment &Comment, DeclarationFragments Fragments,
66bdd1243dSDimitry Andric DeclarationFragments SubHeading, bool IsFromSystemHeader) {
67bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, GlobalVariables, USR, Name, Loc,
68*a58f00eaSDimitry Andric std::move(Availability), Linkage, Comment, Fragments,
69*a58f00eaSDimitry Andric SubHeading, IsFromSystemHeader);
7081ad6265SDimitry Andric }
7181ad6265SDimitry Andric
addGlobalVariableTemplate(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,Template Template,bool IsFromSystemHeader)72c9157d92SDimitry Andric GlobalVariableTemplateRecord *APISet::addGlobalVariableTemplate(
73c9157d92SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
74*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
75c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
76c9157d92SDimitry Andric DeclarationFragments SubHeading, Template Template,
77c9157d92SDimitry Andric bool IsFromSystemHeader) {
78c9157d92SDimitry Andric return addTopLevelRecord(USRBasedLookupTable, GlobalVariableTemplates, USR,
79c9157d92SDimitry Andric Name, Loc, std::move(Availability), Linkage, Comment,
80c9157d92SDimitry Andric Declaration, SubHeading, Template,
81c9157d92SDimitry Andric IsFromSystemHeader);
82c9157d92SDimitry Andric }
83c9157d92SDimitry Andric
addGlobalFunction(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Fragments,DeclarationFragments SubHeading,FunctionSignature Signature,bool IsFromSystemHeader)8481ad6265SDimitry Andric GlobalFunctionRecord *APISet::addGlobalFunction(
8581ad6265SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
86*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
8781ad6265SDimitry Andric const DocComment &Comment, DeclarationFragments Fragments,
88bdd1243dSDimitry Andric DeclarationFragments SubHeading, FunctionSignature Signature,
89bdd1243dSDimitry Andric bool IsFromSystemHeader) {
90bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, GlobalFunctions, USR, Name, Loc,
91*a58f00eaSDimitry Andric std::move(Availability), Linkage, Comment, Fragments,
92*a58f00eaSDimitry Andric SubHeading, Signature, IsFromSystemHeader);
9381ad6265SDimitry Andric }
9481ad6265SDimitry Andric
addGlobalFunctionTemplate(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,Template Template,bool IsFromSystemHeader)95c9157d92SDimitry Andric GlobalFunctionTemplateRecord *APISet::addGlobalFunctionTemplate(
96c9157d92SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
97*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
98c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
99c9157d92SDimitry Andric DeclarationFragments SubHeading, FunctionSignature Signature,
100c9157d92SDimitry Andric Template Template, bool IsFromSystemHeader) {
101c9157d92SDimitry Andric return addTopLevelRecord(USRBasedLookupTable, GlobalFunctionTemplates, USR,
102c9157d92SDimitry Andric Name, Loc, std::move(Availability), Linkage, Comment,
103c9157d92SDimitry Andric Declaration, SubHeading, Signature, Template,
104c9157d92SDimitry Andric IsFromSystemHeader);
105c9157d92SDimitry Andric }
106c9157d92SDimitry Andric
107c9157d92SDimitry Andric GlobalFunctionTemplateSpecializationRecord *
addGlobalFunctionTemplateSpecialization(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,bool IsFromSystemHeader)108c9157d92SDimitry Andric APISet::addGlobalFunctionTemplateSpecialization(
109c9157d92SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
110*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
111c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
112c9157d92SDimitry Andric DeclarationFragments SubHeading, FunctionSignature Signature,
113c9157d92SDimitry Andric bool IsFromSystemHeader) {
114c9157d92SDimitry Andric return addTopLevelRecord(
115c9157d92SDimitry Andric USRBasedLookupTable, GlobalFunctionTemplateSpecializations, USR, Name,
116c9157d92SDimitry Andric Loc, std::move(Availability), Linkage, Comment, Declaration, SubHeading,
117c9157d92SDimitry Andric Signature, IsFromSystemHeader);
118c9157d92SDimitry Andric }
119c9157d92SDimitry Andric
addEnumConstant(EnumRecord * Enum,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)120bdd1243dSDimitry Andric EnumConstantRecord *APISet::addEnumConstant(EnumRecord *Enum, StringRef Name,
121bdd1243dSDimitry Andric StringRef USR, PresumedLoc Loc,
122*a58f00eaSDimitry Andric AvailabilityInfo Availability,
123bdd1243dSDimitry Andric const DocComment &Comment,
124bdd1243dSDimitry Andric DeclarationFragments Declaration,
125bdd1243dSDimitry Andric DeclarationFragments SubHeading,
126bdd1243dSDimitry Andric bool IsFromSystemHeader) {
12781ad6265SDimitry Andric auto Record = std::make_unique<EnumConstantRecord>(
128*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading,
129*a58f00eaSDimitry Andric IsFromSystemHeader);
130bdd1243dSDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
131bdd1243dSDimitry Andric Enum->USR, Enum->Name, Enum->getKind(), Enum);
132bdd1243dSDimitry Andric USRBasedLookupTable.insert({USR, Record.get()});
13381ad6265SDimitry Andric return Enum->Constants.emplace_back(std::move(Record)).get();
13481ad6265SDimitry Andric }
13581ad6265SDimitry Andric
addEnum(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)13681ad6265SDimitry Andric EnumRecord *APISet::addEnum(StringRef Name, StringRef USR, PresumedLoc Loc,
137*a58f00eaSDimitry Andric AvailabilityInfo Availability,
13881ad6265SDimitry Andric const DocComment &Comment,
13981ad6265SDimitry Andric DeclarationFragments Declaration,
140bdd1243dSDimitry Andric DeclarationFragments SubHeading,
141bdd1243dSDimitry Andric bool IsFromSystemHeader) {
142bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, Enums, USR, Name, Loc,
143*a58f00eaSDimitry Andric std::move(Availability), Comment, Declaration,
144bdd1243dSDimitry Andric SubHeading, IsFromSystemHeader);
14581ad6265SDimitry Andric }
14681ad6265SDimitry Andric
addRecordField(RecordRecord * Record,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,APIRecord::RecordKind Kind,bool IsFromSystemHeader)147*a58f00eaSDimitry Andric RecordFieldRecord *APISet::addRecordField(
148*a58f00eaSDimitry Andric RecordRecord *Record, StringRef Name, StringRef USR, PresumedLoc Loc,
149*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
150*a58f00eaSDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
151*a58f00eaSDimitry Andric APIRecord::RecordKind Kind, bool IsFromSystemHeader) {
152*a58f00eaSDimitry Andric auto RecordField = std::make_unique<RecordFieldRecord>(
153*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading,
154*a58f00eaSDimitry Andric Kind, IsFromSystemHeader);
155*a58f00eaSDimitry Andric RecordField->ParentInformation = APIRecord::HierarchyInformation(
156*a58f00eaSDimitry Andric Record->USR, Record->Name, Record->getKind(), Record);
157*a58f00eaSDimitry Andric USRBasedLookupTable.insert({USR, RecordField.get()});
158*a58f00eaSDimitry Andric return Record->Fields.emplace_back(std::move(RecordField)).get();
15981ad6265SDimitry Andric }
16081ad6265SDimitry Andric
addRecord(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,APIRecord::RecordKind Kind,bool IsFromSystemHeader)161*a58f00eaSDimitry Andric RecordRecord *APISet::addRecord(StringRef Name, StringRef USR, PresumedLoc Loc,
162*a58f00eaSDimitry Andric AvailabilityInfo Availability,
16381ad6265SDimitry Andric const DocComment &Comment,
16481ad6265SDimitry Andric DeclarationFragments Declaration,
165bdd1243dSDimitry Andric DeclarationFragments SubHeading,
166*a58f00eaSDimitry Andric APIRecord::RecordKind Kind,
167bdd1243dSDimitry Andric bool IsFromSystemHeader) {
168*a58f00eaSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, Records, USR, Name, Loc,
169*a58f00eaSDimitry Andric std::move(Availability), Comment, Declaration,
170*a58f00eaSDimitry Andric SubHeading, Kind, IsFromSystemHeader);
17181ad6265SDimitry Andric }
17281ad6265SDimitry Andric
173c9157d92SDimitry Andric StaticFieldRecord *
addStaticField(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference Context,AccessControl Access,bool IsFromSystemHeader)174c9157d92SDimitry Andric APISet::addStaticField(StringRef Name, StringRef USR, PresumedLoc Loc,
175*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
176c9157d92SDimitry Andric const DocComment &Comment,
177c9157d92SDimitry Andric DeclarationFragments Declaration,
178c9157d92SDimitry Andric DeclarationFragments SubHeading, SymbolReference Context,
179c9157d92SDimitry Andric AccessControl Access, bool IsFromSystemHeader) {
180c9157d92SDimitry Andric return addTopLevelRecord(USRBasedLookupTable, StaticFields, USR, Name, Loc,
181*a58f00eaSDimitry Andric std::move(Availability), Linkage, Comment,
182c9157d92SDimitry Andric Declaration, SubHeading, Context, Access,
183c9157d92SDimitry Andric IsFromSystemHeader);
184c9157d92SDimitry Andric }
185c9157d92SDimitry Andric
186c9157d92SDimitry Andric CXXFieldRecord *
addCXXField(APIRecord * CXXClass,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,AccessControl Access,bool IsFromSystemHeader)187c9157d92SDimitry Andric APISet::addCXXField(APIRecord *CXXClass, StringRef Name, StringRef USR,
188*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability,
189c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
190c9157d92SDimitry Andric DeclarationFragments SubHeading, AccessControl Access,
191c9157d92SDimitry Andric bool IsFromSystemHeader) {
192c9157d92SDimitry Andric auto *Record = addTopLevelRecord(
193*a58f00eaSDimitry Andric USRBasedLookupTable, CXXFields, USR, Name, Loc, std::move(Availability),
194c9157d92SDimitry Andric Comment, Declaration, SubHeading, Access, IsFromSystemHeader);
195c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
196c9157d92SDimitry Andric CXXClass->USR, CXXClass->Name, CXXClass->getKind(), CXXClass);
197c9157d92SDimitry Andric return Record;
198c9157d92SDimitry Andric }
199c9157d92SDimitry Andric
addCXXFieldTemplate(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,AccessControl Access,Template Template,bool IsFromSystemHeader)200c9157d92SDimitry Andric CXXFieldTemplateRecord *APISet::addCXXFieldTemplate(
201c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
202*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
203c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
204c9157d92SDimitry Andric AccessControl Access, Template Template, bool IsFromSystemHeader) {
205c9157d92SDimitry Andric auto *Record =
206c9157d92SDimitry Andric addTopLevelRecord(USRBasedLookupTable, CXXFieldTemplates, USR, Name, Loc,
207c9157d92SDimitry Andric std::move(Availability), Comment, Declaration,
208c9157d92SDimitry Andric SubHeading, Access, Template, IsFromSystemHeader);
209c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
210c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
211c9157d92SDimitry Andric
212c9157d92SDimitry Andric return Record;
213c9157d92SDimitry Andric }
214c9157d92SDimitry Andric
215c9157d92SDimitry Andric CXXClassRecord *
addCXXClass(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,APIRecord::RecordKind Kind,AccessControl Access,bool IsFromSystemHeader)216c9157d92SDimitry Andric APISet::addCXXClass(APIRecord *Parent, StringRef Name, StringRef USR,
217*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability,
218c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
219c9157d92SDimitry Andric DeclarationFragments SubHeading, APIRecord::RecordKind Kind,
220c9157d92SDimitry Andric AccessControl Access, bool IsFromSystemHeader) {
221*a58f00eaSDimitry Andric auto *Record = addTopLevelRecord(
222*a58f00eaSDimitry Andric USRBasedLookupTable, CXXClasses, USR, Name, Loc, std::move(Availability),
223*a58f00eaSDimitry Andric Comment, Declaration, SubHeading, Kind, Access, IsFromSystemHeader);
224c9157d92SDimitry Andric if (Parent)
225c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
226c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
227c9157d92SDimitry Andric return Record;
228c9157d92SDimitry Andric }
229c9157d92SDimitry Andric
addClassTemplate(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,Template Template,AccessControl Access,bool IsFromSystemHeader)230c9157d92SDimitry Andric ClassTemplateRecord *APISet::addClassTemplate(
231c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
232*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
233c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
234c9157d92SDimitry Andric Template Template, AccessControl Access, bool IsFromSystemHeader) {
235c9157d92SDimitry Andric auto *Record =
236c9157d92SDimitry Andric addTopLevelRecord(USRBasedLookupTable, ClassTemplates, USR, Name, Loc,
237c9157d92SDimitry Andric std::move(Availability), Comment, Declaration,
238c9157d92SDimitry Andric SubHeading, Template, Access, IsFromSystemHeader);
239c9157d92SDimitry Andric if (Parent)
240c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
241c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
242c9157d92SDimitry Andric return Record;
243c9157d92SDimitry Andric }
244c9157d92SDimitry Andric
addClassTemplateSpecialization(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,AccessControl Access,bool IsFromSystemHeader)245c9157d92SDimitry Andric ClassTemplateSpecializationRecord *APISet::addClassTemplateSpecialization(
246c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
247*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
248c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
249c9157d92SDimitry Andric AccessControl Access, bool IsFromSystemHeader) {
250c9157d92SDimitry Andric auto *Record =
251c9157d92SDimitry Andric addTopLevelRecord(USRBasedLookupTable, ClassTemplateSpecializations, USR,
252c9157d92SDimitry Andric Name, Loc, std::move(Availability), Comment,
253c9157d92SDimitry Andric Declaration, SubHeading, Access, IsFromSystemHeader);
254c9157d92SDimitry Andric if (Parent)
255c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
256c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
257c9157d92SDimitry Andric return Record;
258c9157d92SDimitry Andric }
259c9157d92SDimitry Andric
260c9157d92SDimitry Andric ClassTemplatePartialSpecializationRecord *
addClassTemplatePartialSpecialization(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,Template Template,AccessControl Access,bool IsFromSystemHeader)261c9157d92SDimitry Andric APISet::addClassTemplatePartialSpecialization(
262c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
263*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
264c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
265c9157d92SDimitry Andric Template Template, AccessControl Access, bool IsFromSystemHeader) {
266c9157d92SDimitry Andric auto *Record = addTopLevelRecord(
267c9157d92SDimitry Andric USRBasedLookupTable, ClassTemplatePartialSpecializations, USR, Name, Loc,
268c9157d92SDimitry Andric std::move(Availability), Comment, Declaration, SubHeading, Template,
269c9157d92SDimitry Andric Access, IsFromSystemHeader);
270c9157d92SDimitry Andric if (Parent)
271c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
272c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
273c9157d92SDimitry Andric return Record;
274c9157d92SDimitry Andric }
275c9157d92SDimitry Andric
276c9157d92SDimitry Andric GlobalVariableTemplateSpecializationRecord *
addGlobalVariableTemplateSpecialization(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)277c9157d92SDimitry Andric APISet::addGlobalVariableTemplateSpecialization(
278c9157d92SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
279*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
280c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
281c9157d92SDimitry Andric DeclarationFragments SubHeading, bool IsFromSystemHeader) {
282c9157d92SDimitry Andric return addTopLevelRecord(USRBasedLookupTable,
283c9157d92SDimitry Andric GlobalVariableTemplateSpecializations, USR, Name,
284c9157d92SDimitry Andric Loc, std::move(Availability), Linkage, Comment,
285c9157d92SDimitry Andric Declaration, SubHeading, IsFromSystemHeader);
286c9157d92SDimitry Andric }
287c9157d92SDimitry Andric
288c9157d92SDimitry Andric GlobalVariableTemplatePartialSpecializationRecord *
addGlobalVariableTemplatePartialSpecialization(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,Template Template,bool IsFromSystemHeader)289c9157d92SDimitry Andric APISet::addGlobalVariableTemplatePartialSpecialization(
290c9157d92SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
291*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
292c9157d92SDimitry Andric const DocComment &Comment, DeclarationFragments Declaration,
293c9157d92SDimitry Andric DeclarationFragments SubHeading, Template Template,
294c9157d92SDimitry Andric bool IsFromSystemHeader) {
295c9157d92SDimitry Andric return addTopLevelRecord(
296c9157d92SDimitry Andric USRBasedLookupTable, GlobalVariableTemplatePartialSpecializations, USR,
297c9157d92SDimitry Andric Name, Loc, std::move(Availability), Linkage, Comment, Declaration,
298c9157d92SDimitry Andric SubHeading, Template, IsFromSystemHeader);
299c9157d92SDimitry Andric }
300c9157d92SDimitry Andric
addConcept(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,Template Template,bool IsFromSystemHeader)301c9157d92SDimitry Andric ConceptRecord *APISet::addConcept(StringRef Name, StringRef USR,
302*a58f00eaSDimitry Andric PresumedLoc Loc,
303*a58f00eaSDimitry Andric AvailabilityInfo Availability,
304c9157d92SDimitry Andric const DocComment &Comment,
305c9157d92SDimitry Andric DeclarationFragments Declaration,
306c9157d92SDimitry Andric DeclarationFragments SubHeading,
307c9157d92SDimitry Andric Template Template, bool IsFromSystemHeader) {
308c9157d92SDimitry Andric return addTopLevelRecord(USRBasedLookupTable, Concepts, USR, Name, Loc,
309c9157d92SDimitry Andric std::move(Availability), Comment, Declaration,
310c9157d92SDimitry Andric SubHeading, Template, IsFromSystemHeader);
311c9157d92SDimitry Andric }
312c9157d92SDimitry Andric
addCXXInstanceMethod(APIRecord * CXXClassRecord,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,AccessControl Access,bool IsFromSystemHeader)313c9157d92SDimitry Andric CXXMethodRecord *APISet::addCXXInstanceMethod(
314c9157d92SDimitry Andric APIRecord *CXXClassRecord, StringRef Name, StringRef USR, PresumedLoc Loc,
315*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
316c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
317c9157d92SDimitry Andric FunctionSignature Signature, AccessControl Access,
318c9157d92SDimitry Andric bool IsFromSystemHeader) {
319c9157d92SDimitry Andric CXXMethodRecord *Record =
320c9157d92SDimitry Andric addTopLevelRecord(USRBasedLookupTable, CXXInstanceMethods, USR, Name, Loc,
321c9157d92SDimitry Andric std::move(Availability), Comment, Declaration,
322c9157d92SDimitry Andric SubHeading, Signature, Access, IsFromSystemHeader);
323c9157d92SDimitry Andric
324c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
325c9157d92SDimitry Andric CXXClassRecord->USR, CXXClassRecord->Name, CXXClassRecord->getKind(),
326c9157d92SDimitry Andric CXXClassRecord);
327c9157d92SDimitry Andric return Record;
328c9157d92SDimitry Andric }
329c9157d92SDimitry Andric
addCXXStaticMethod(APIRecord * CXXClassRecord,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,AccessControl Access,bool IsFromSystemHeader)330c9157d92SDimitry Andric CXXMethodRecord *APISet::addCXXStaticMethod(
331c9157d92SDimitry Andric APIRecord *CXXClassRecord, StringRef Name, StringRef USR, PresumedLoc Loc,
332*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
333c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
334c9157d92SDimitry Andric FunctionSignature Signature, AccessControl Access,
335c9157d92SDimitry Andric bool IsFromSystemHeader) {
336c9157d92SDimitry Andric CXXMethodRecord *Record =
337c9157d92SDimitry Andric addTopLevelRecord(USRBasedLookupTable, CXXStaticMethods, USR, Name, Loc,
338c9157d92SDimitry Andric std::move(Availability), Comment, Declaration,
339c9157d92SDimitry Andric SubHeading, Signature, Access, IsFromSystemHeader);
340c9157d92SDimitry Andric
341c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
342c9157d92SDimitry Andric CXXClassRecord->USR, CXXClassRecord->Name, CXXClassRecord->getKind(),
343c9157d92SDimitry Andric CXXClassRecord);
344c9157d92SDimitry Andric return Record;
345c9157d92SDimitry Andric }
346c9157d92SDimitry Andric
addCXXMethodTemplate(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,AccessControl Access,Template Template,bool IsFromSystemHeader)347c9157d92SDimitry Andric CXXMethodTemplateRecord *APISet::addCXXMethodTemplate(
348c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
349*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
350c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
351c9157d92SDimitry Andric FunctionSignature Signature, AccessControl Access, Template Template,
352c9157d92SDimitry Andric bool IsFromSystemHeader) {
353c9157d92SDimitry Andric auto *Record = addTopLevelRecord(USRBasedLookupTable, CXXMethodTemplates, USR,
354c9157d92SDimitry Andric Name, Loc, std::move(Availability), Comment,
355c9157d92SDimitry Andric Declaration, SubHeading, Signature, Access,
356c9157d92SDimitry Andric Template, IsFromSystemHeader);
357c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
358c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
359c9157d92SDimitry Andric
360c9157d92SDimitry Andric return Record;
361c9157d92SDimitry Andric }
362c9157d92SDimitry Andric
addCXXMethodTemplateSpec(APIRecord * Parent,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,AccessControl Access,bool IsFromSystemHeader)363c9157d92SDimitry Andric CXXMethodTemplateSpecializationRecord *APISet::addCXXMethodTemplateSpec(
364c9157d92SDimitry Andric APIRecord *Parent, StringRef Name, StringRef USR, PresumedLoc Loc,
365*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
366c9157d92SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
367c9157d92SDimitry Andric FunctionSignature Signature, AccessControl Access,
368c9157d92SDimitry Andric bool IsFromSystemHeader) {
369c9157d92SDimitry Andric
370c9157d92SDimitry Andric auto *Record = addTopLevelRecord(
371c9157d92SDimitry Andric USRBasedLookupTable, CXXMethodTemplateSpecializations, USR, Name, Loc,
372c9157d92SDimitry Andric std::move(Availability), Comment, Declaration, SubHeading, Signature,
373c9157d92SDimitry Andric Access, IsFromSystemHeader);
374c9157d92SDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
375c9157d92SDimitry Andric Parent->USR, Parent->Name, Parent->getKind(), Parent);
376c9157d92SDimitry Andric
377c9157d92SDimitry Andric return Record;
378c9157d92SDimitry Andric }
379c9157d92SDimitry Andric
addObjCCategory(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference Interface,bool IsFromSystemHeader,bool IsFromExternalModule)38081ad6265SDimitry Andric ObjCCategoryRecord *APISet::addObjCCategory(
38181ad6265SDimitry Andric StringRef Name, StringRef USR, PresumedLoc Loc,
382*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
38381ad6265SDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
384c9157d92SDimitry Andric SymbolReference Interface, bool IsFromSystemHeader,
385c9157d92SDimitry Andric bool IsFromExternalModule) {
38681ad6265SDimitry Andric // Create the category record.
387bdd1243dSDimitry Andric auto *Record =
388bdd1243dSDimitry Andric addTopLevelRecord(USRBasedLookupTable, ObjCCategories, USR, Name, Loc,
389*a58f00eaSDimitry Andric std::move(Availability), Comment, Declaration,
390bdd1243dSDimitry Andric SubHeading, Interface, IsFromSystemHeader);
39181ad6265SDimitry Andric
392c9157d92SDimitry Andric Record->IsFromExternalModule = IsFromExternalModule;
393c9157d92SDimitry Andric
39481ad6265SDimitry Andric auto It = ObjCInterfaces.find(Interface.USR);
39581ad6265SDimitry Andric if (It != ObjCInterfaces.end())
39681ad6265SDimitry Andric It->second->Categories.push_back(Record);
39781ad6265SDimitry Andric
39881ad6265SDimitry Andric return Record;
39981ad6265SDimitry Andric }
40081ad6265SDimitry Andric
401bdd1243dSDimitry Andric ObjCInterfaceRecord *
addObjCInterface(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference SuperClass,bool IsFromSystemHeader)402bdd1243dSDimitry Andric APISet::addObjCInterface(StringRef Name, StringRef USR, PresumedLoc Loc,
403*a58f00eaSDimitry Andric AvailabilityInfo Availability, LinkageInfo Linkage,
404bdd1243dSDimitry Andric const DocComment &Comment,
405bdd1243dSDimitry Andric DeclarationFragments Declaration,
406bdd1243dSDimitry Andric DeclarationFragments SubHeading,
407bdd1243dSDimitry Andric SymbolReference SuperClass, bool IsFromSystemHeader) {
408bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, ObjCInterfaces, USR, Name, Loc,
409*a58f00eaSDimitry Andric std::move(Availability), Linkage, Comment,
410bdd1243dSDimitry Andric Declaration, SubHeading, SuperClass,
411bdd1243dSDimitry Andric IsFromSystemHeader);
41281ad6265SDimitry Andric }
41381ad6265SDimitry Andric
addObjCMethod(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,bool IsInstanceMethod,bool IsFromSystemHeader)41481ad6265SDimitry Andric ObjCMethodRecord *APISet::addObjCMethod(
41581ad6265SDimitry Andric ObjCContainerRecord *Container, StringRef Name, StringRef USR,
416*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment,
417bdd1243dSDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
418bdd1243dSDimitry Andric FunctionSignature Signature, bool IsInstanceMethod,
419bdd1243dSDimitry Andric bool IsFromSystemHeader) {
420bdd1243dSDimitry Andric std::unique_ptr<ObjCMethodRecord> Record;
421bdd1243dSDimitry Andric if (IsInstanceMethod)
422bdd1243dSDimitry Andric Record = std::make_unique<ObjCInstanceMethodRecord>(
423*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration,
424bdd1243dSDimitry Andric SubHeading, Signature, IsFromSystemHeader);
425bdd1243dSDimitry Andric else
426bdd1243dSDimitry Andric Record = std::make_unique<ObjCClassMethodRecord>(
427*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration,
428bdd1243dSDimitry Andric SubHeading, Signature, IsFromSystemHeader);
429bdd1243dSDimitry Andric
430bdd1243dSDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
431bdd1243dSDimitry Andric Container->USR, Container->Name, Container->getKind(), Container);
432bdd1243dSDimitry Andric USRBasedLookupTable.insert({USR, Record.get()});
43381ad6265SDimitry Andric return Container->Methods.emplace_back(std::move(Record)).get();
43481ad6265SDimitry Andric }
43581ad6265SDimitry Andric
addObjCProperty(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,ObjCPropertyRecord::AttributeKind Attributes,StringRef GetterName,StringRef SetterName,bool IsOptional,bool IsInstanceProperty,bool IsFromSystemHeader)43681ad6265SDimitry Andric ObjCPropertyRecord *APISet::addObjCProperty(
43781ad6265SDimitry Andric ObjCContainerRecord *Container, StringRef Name, StringRef USR,
438*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment,
439bdd1243dSDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
44081ad6265SDimitry Andric ObjCPropertyRecord::AttributeKind Attributes, StringRef GetterName,
441bdd1243dSDimitry Andric StringRef SetterName, bool IsOptional, bool IsInstanceProperty,
442bdd1243dSDimitry Andric bool IsFromSystemHeader) {
443bdd1243dSDimitry Andric std::unique_ptr<ObjCPropertyRecord> Record;
444bdd1243dSDimitry Andric if (IsInstanceProperty)
445bdd1243dSDimitry Andric Record = std::make_unique<ObjCInstancePropertyRecord>(
446*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration,
447bdd1243dSDimitry Andric SubHeading, Attributes, GetterName, SetterName, IsOptional,
448bdd1243dSDimitry Andric IsFromSystemHeader);
449bdd1243dSDimitry Andric else
450bdd1243dSDimitry Andric Record = std::make_unique<ObjCClassPropertyRecord>(
451*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration,
452bdd1243dSDimitry Andric SubHeading, Attributes, GetterName, SetterName, IsOptional,
453bdd1243dSDimitry Andric IsFromSystemHeader);
454bdd1243dSDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
455bdd1243dSDimitry Andric Container->USR, Container->Name, Container->getKind(), Container);
456bdd1243dSDimitry Andric USRBasedLookupTable.insert({USR, Record.get()});
45781ad6265SDimitry Andric return Container->Properties.emplace_back(std::move(Record)).get();
45881ad6265SDimitry Andric }
45981ad6265SDimitry Andric
addObjCInstanceVariable(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,ObjCInstanceVariableRecord::AccessControl Access,bool IsFromSystemHeader)46081ad6265SDimitry Andric ObjCInstanceVariableRecord *APISet::addObjCInstanceVariable(
46181ad6265SDimitry Andric ObjCContainerRecord *Container, StringRef Name, StringRef USR,
462*a58f00eaSDimitry Andric PresumedLoc Loc, AvailabilityInfo Availability, const DocComment &Comment,
463bdd1243dSDimitry Andric DeclarationFragments Declaration, DeclarationFragments SubHeading,
464bdd1243dSDimitry Andric ObjCInstanceVariableRecord::AccessControl Access, bool IsFromSystemHeader) {
46581ad6265SDimitry Andric auto Record = std::make_unique<ObjCInstanceVariableRecord>(
466*a58f00eaSDimitry Andric USR, Name, Loc, std::move(Availability), Comment, Declaration, SubHeading,
467*a58f00eaSDimitry Andric Access, IsFromSystemHeader);
468bdd1243dSDimitry Andric Record->ParentInformation = APIRecord::HierarchyInformation(
469bdd1243dSDimitry Andric Container->USR, Container->Name, Container->getKind(), Container);
470bdd1243dSDimitry Andric USRBasedLookupTable.insert({USR, Record.get()});
47181ad6265SDimitry Andric return Container->Ivars.emplace_back(std::move(Record)).get();
47281ad6265SDimitry Andric }
47381ad6265SDimitry Andric
addObjCProtocol(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)474bdd1243dSDimitry Andric ObjCProtocolRecord *APISet::addObjCProtocol(StringRef Name, StringRef USR,
475bdd1243dSDimitry Andric PresumedLoc Loc,
476*a58f00eaSDimitry Andric AvailabilityInfo Availability,
477bdd1243dSDimitry Andric const DocComment &Comment,
478bdd1243dSDimitry Andric DeclarationFragments Declaration,
479bdd1243dSDimitry Andric DeclarationFragments SubHeading,
480bdd1243dSDimitry Andric bool IsFromSystemHeader) {
481bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, ObjCProtocols, USR, Name, Loc,
482*a58f00eaSDimitry Andric std::move(Availability), Comment, Declaration,
483bdd1243dSDimitry Andric SubHeading, IsFromSystemHeader);
48481ad6265SDimitry Andric }
48581ad6265SDimitry Andric
48681ad6265SDimitry Andric MacroDefinitionRecord *
addMacroDefinition(StringRef Name,StringRef USR,PresumedLoc Loc,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)48781ad6265SDimitry Andric APISet::addMacroDefinition(StringRef Name, StringRef USR, PresumedLoc Loc,
48881ad6265SDimitry Andric DeclarationFragments Declaration,
489bdd1243dSDimitry Andric DeclarationFragments SubHeading,
490bdd1243dSDimitry Andric bool IsFromSystemHeader) {
491bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, Macros, USR, Name, Loc,
492bdd1243dSDimitry Andric Declaration, SubHeading, IsFromSystemHeader);
49381ad6265SDimitry Andric }
49481ad6265SDimitry Andric
495bdd1243dSDimitry Andric TypedefRecord *
addTypedef(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilityInfo Availability,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference UnderlyingType,bool IsFromSystemHeader)496bdd1243dSDimitry Andric APISet::addTypedef(StringRef Name, StringRef USR, PresumedLoc Loc,
497*a58f00eaSDimitry Andric AvailabilityInfo Availability, const DocComment &Comment,
49881ad6265SDimitry Andric DeclarationFragments Declaration,
49981ad6265SDimitry Andric DeclarationFragments SubHeading,
500bdd1243dSDimitry Andric SymbolReference UnderlyingType, bool IsFromSystemHeader) {
501bdd1243dSDimitry Andric return addTopLevelRecord(USRBasedLookupTable, Typedefs, USR, Name, Loc,
502*a58f00eaSDimitry Andric std::move(Availability), Comment, Declaration,
503bdd1243dSDimitry Andric SubHeading, UnderlyingType, IsFromSystemHeader);
504bdd1243dSDimitry Andric }
505bdd1243dSDimitry Andric
findRecordForUSR(StringRef USR) const506bdd1243dSDimitry Andric APIRecord *APISet::findRecordForUSR(StringRef USR) const {
507bdd1243dSDimitry Andric if (USR.empty())
508bdd1243dSDimitry Andric return nullptr;
509bdd1243dSDimitry Andric
510fe013be4SDimitry Andric return USRBasedLookupTable.lookup(USR);
51181ad6265SDimitry Andric }
51281ad6265SDimitry Andric
recordUSR(const Decl * D)51381ad6265SDimitry Andric StringRef APISet::recordUSR(const Decl *D) {
51481ad6265SDimitry Andric SmallString<128> USR;
51581ad6265SDimitry Andric index::generateUSRForDecl(D, USR);
51681ad6265SDimitry Andric return copyString(USR);
51781ad6265SDimitry Andric }
51881ad6265SDimitry Andric
recordUSRForMacro(StringRef Name,SourceLocation SL,const SourceManager & SM)51981ad6265SDimitry Andric StringRef APISet::recordUSRForMacro(StringRef Name, SourceLocation SL,
52081ad6265SDimitry Andric const SourceManager &SM) {
52181ad6265SDimitry Andric SmallString<128> USR;
52281ad6265SDimitry Andric index::generateUSRForMacro(Name, SL, SM, USR);
52381ad6265SDimitry Andric return copyString(USR);
52481ad6265SDimitry Andric }
52581ad6265SDimitry Andric
copyString(StringRef String)52681ad6265SDimitry Andric StringRef APISet::copyString(StringRef String) {
52781ad6265SDimitry Andric if (String.empty())
52881ad6265SDimitry Andric return {};
52981ad6265SDimitry Andric
53081ad6265SDimitry Andric // No need to allocate memory and copy if the string has already been stored.
53181ad6265SDimitry Andric if (StringAllocator.identifyObject(String.data()))
53281ad6265SDimitry Andric return String;
53381ad6265SDimitry Andric
53481ad6265SDimitry Andric void *Ptr = StringAllocator.Allocate(String.size(), 1);
53581ad6265SDimitry Andric memcpy(Ptr, String.data(), String.size());
53681ad6265SDimitry Andric return StringRef(reinterpret_cast<const char *>(Ptr), String.size());
53781ad6265SDimitry Andric }
53881ad6265SDimitry Andric
~APIRecord()53981ad6265SDimitry Andric APIRecord::~APIRecord() {}
~ObjCContainerRecord()54081ad6265SDimitry Andric ObjCContainerRecord::~ObjCContainerRecord() {}
~ObjCMethodRecord()541bdd1243dSDimitry Andric ObjCMethodRecord::~ObjCMethodRecord() {}
~ObjCPropertyRecord()542bdd1243dSDimitry Andric ObjCPropertyRecord::~ObjCPropertyRecord() {}
~CXXMethodRecord()543c9157d92SDimitry Andric CXXMethodRecord::~CXXMethodRecord() {}
54481ad6265SDimitry Andric
anchor()54581ad6265SDimitry Andric void GlobalFunctionRecord::anchor() {}
anchor()54681ad6265SDimitry Andric void GlobalVariableRecord::anchor() {}
anchor()54781ad6265SDimitry Andric void EnumConstantRecord::anchor() {}
anchor()54881ad6265SDimitry Andric void EnumRecord::anchor() {}
anchor()549*a58f00eaSDimitry Andric void RecordFieldRecord::anchor() {}
anchor()550*a58f00eaSDimitry Andric void RecordRecord::anchor() {}
anchor()551c9157d92SDimitry Andric void CXXFieldRecord::anchor() {}
anchor()552c9157d92SDimitry Andric void CXXClassRecord::anchor() {}
anchor()553c9157d92SDimitry Andric void CXXConstructorRecord::anchor() {}
anchor()554c9157d92SDimitry Andric void CXXDestructorRecord::anchor() {}
anchor()555c9157d92SDimitry Andric void CXXInstanceMethodRecord::anchor() {}
anchor()556c9157d92SDimitry Andric void CXXStaticMethodRecord::anchor() {}
anchor()557bdd1243dSDimitry Andric void ObjCInstancePropertyRecord::anchor() {}
anchor()558bdd1243dSDimitry Andric void ObjCClassPropertyRecord::anchor() {}
anchor()55981ad6265SDimitry Andric void ObjCInstanceVariableRecord::anchor() {}
anchor()560bdd1243dSDimitry Andric void ObjCInstanceMethodRecord::anchor() {}
anchor()561bdd1243dSDimitry Andric void ObjCClassMethodRecord::anchor() {}
anchor()56281ad6265SDimitry Andric void ObjCCategoryRecord::anchor() {}
anchor()56381ad6265SDimitry Andric void ObjCInterfaceRecord::anchor() {}
anchor()56481ad6265SDimitry Andric void ObjCProtocolRecord::anchor() {}
anchor()56581ad6265SDimitry Andric void MacroDefinitionRecord::anchor() {}
anchor()56681ad6265SDimitry Andric void TypedefRecord::anchor() {}
567