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