xref: /openbsd-src/gnu/llvm/clang/lib/ExtractAPI/API.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1*12c85518Srobert //===- ExtractAPI/API.cpp ---------------------------------------*- C++ -*-===//
2*12c85518Srobert //
3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information.
5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*12c85518Srobert //
7*12c85518Srobert //===----------------------------------------------------------------------===//
8*12c85518Srobert ///
9*12c85518Srobert /// \file
10*12c85518Srobert /// This file implements the APIRecord and derived record structs,
11*12c85518Srobert /// and the APISet class.
12*12c85518Srobert ///
13*12c85518Srobert //===----------------------------------------------------------------------===//
14*12c85518Srobert 
15*12c85518Srobert #include "clang/ExtractAPI/API.h"
16*12c85518Srobert #include "clang/AST/CommentCommandTraits.h"
17*12c85518Srobert #include "clang/AST/CommentLexer.h"
18*12c85518Srobert #include "clang/AST/RawCommentList.h"
19*12c85518Srobert #include "clang/Index/USRGeneration.h"
20*12c85518Srobert #include "llvm/ADT/STLFunctionalExtras.h"
21*12c85518Srobert #include "llvm/ADT/StringRef.h"
22*12c85518Srobert #include <memory>
23*12c85518Srobert 
24*12c85518Srobert using namespace clang::extractapi;
25*12c85518Srobert using namespace llvm;
26*12c85518Srobert 
27*12c85518Srobert namespace {
28*12c85518Srobert 
29*12c85518Srobert template <typename RecordTy, typename... CtorArgsTy>
addTopLevelRecord(DenseMap<StringRef,APIRecord * > & USRLookupTable,APISet::RecordMap<RecordTy> & RecordMap,StringRef USR,CtorArgsTy &&...CtorArgs)30*12c85518Srobert RecordTy *addTopLevelRecord(DenseMap<StringRef, APIRecord *> &USRLookupTable,
31*12c85518Srobert                             APISet::RecordMap<RecordTy> &RecordMap,
32*12c85518Srobert                             StringRef USR, CtorArgsTy &&...CtorArgs) {
33*12c85518Srobert   auto Result = RecordMap.insert({USR, nullptr});
34*12c85518Srobert 
35*12c85518Srobert   // Create the record if it does not already exist
36*12c85518Srobert   if (Result.second)
37*12c85518Srobert     Result.first->second =
38*12c85518Srobert         std::make_unique<RecordTy>(USR, std::forward<CtorArgsTy>(CtorArgs)...);
39*12c85518Srobert 
40*12c85518Srobert   auto *Record = Result.first->second.get();
41*12c85518Srobert   USRLookupTable.insert({USR, Record});
42*12c85518Srobert   return Record;
43*12c85518Srobert }
44*12c85518Srobert 
45*12c85518Srobert } // namespace
46*12c85518Srobert 
47*12c85518Srobert GlobalVariableRecord *
addGlobalVar(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Fragments,DeclarationFragments SubHeading,bool IsFromSystemHeader)48*12c85518Srobert APISet::addGlobalVar(StringRef Name, StringRef USR, PresumedLoc Loc,
49*12c85518Srobert                      AvailabilitySet Availabilities, LinkageInfo Linkage,
50*12c85518Srobert                      const DocComment &Comment, DeclarationFragments Fragments,
51*12c85518Srobert                      DeclarationFragments SubHeading, bool IsFromSystemHeader) {
52*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, GlobalVariables, USR, Name, Loc,
53*12c85518Srobert                            std::move(Availabilities), Linkage, Comment,
54*12c85518Srobert                            Fragments, SubHeading, IsFromSystemHeader);
55*12c85518Srobert }
56*12c85518Srobert 
addGlobalFunction(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Fragments,DeclarationFragments SubHeading,FunctionSignature Signature,bool IsFromSystemHeader)57*12c85518Srobert GlobalFunctionRecord *APISet::addGlobalFunction(
58*12c85518Srobert     StringRef Name, StringRef USR, PresumedLoc Loc,
59*12c85518Srobert     AvailabilitySet Availabilities, LinkageInfo Linkage,
60*12c85518Srobert     const DocComment &Comment, DeclarationFragments Fragments,
61*12c85518Srobert     DeclarationFragments SubHeading, FunctionSignature Signature,
62*12c85518Srobert     bool IsFromSystemHeader) {
63*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, GlobalFunctions, USR, Name, Loc,
64*12c85518Srobert                            std::move(Availabilities), Linkage, Comment,
65*12c85518Srobert                            Fragments, SubHeading, Signature,
66*12c85518Srobert                            IsFromSystemHeader);
67*12c85518Srobert }
68*12c85518Srobert 
addEnumConstant(EnumRecord * Enum,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)69*12c85518Srobert EnumConstantRecord *APISet::addEnumConstant(EnumRecord *Enum, StringRef Name,
70*12c85518Srobert                                             StringRef USR, PresumedLoc Loc,
71*12c85518Srobert                                             AvailabilitySet Availabilities,
72*12c85518Srobert                                             const DocComment &Comment,
73*12c85518Srobert                                             DeclarationFragments Declaration,
74*12c85518Srobert                                             DeclarationFragments SubHeading,
75*12c85518Srobert                                             bool IsFromSystemHeader) {
76*12c85518Srobert   auto Record = std::make_unique<EnumConstantRecord>(
77*12c85518Srobert       USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
78*12c85518Srobert       SubHeading, IsFromSystemHeader);
79*12c85518Srobert   Record->ParentInformation = APIRecord::HierarchyInformation(
80*12c85518Srobert       Enum->USR, Enum->Name, Enum->getKind(), Enum);
81*12c85518Srobert   USRBasedLookupTable.insert({USR, Record.get()});
82*12c85518Srobert   return Enum->Constants.emplace_back(std::move(Record)).get();
83*12c85518Srobert }
84*12c85518Srobert 
addEnum(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)85*12c85518Srobert EnumRecord *APISet::addEnum(StringRef Name, StringRef USR, PresumedLoc Loc,
86*12c85518Srobert                             AvailabilitySet Availabilities,
87*12c85518Srobert                             const DocComment &Comment,
88*12c85518Srobert                             DeclarationFragments Declaration,
89*12c85518Srobert                             DeclarationFragments SubHeading,
90*12c85518Srobert                             bool IsFromSystemHeader) {
91*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, Enums, USR, Name, Loc,
92*12c85518Srobert                            std::move(Availabilities), Comment, Declaration,
93*12c85518Srobert                            SubHeading, IsFromSystemHeader);
94*12c85518Srobert }
95*12c85518Srobert 
addStructField(StructRecord * Struct,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)96*12c85518Srobert StructFieldRecord *APISet::addStructField(StructRecord *Struct, StringRef Name,
97*12c85518Srobert                                           StringRef USR, PresumedLoc Loc,
98*12c85518Srobert                                           AvailabilitySet Availabilities,
99*12c85518Srobert                                           const DocComment &Comment,
100*12c85518Srobert                                           DeclarationFragments Declaration,
101*12c85518Srobert                                           DeclarationFragments SubHeading,
102*12c85518Srobert                                           bool IsFromSystemHeader) {
103*12c85518Srobert   auto Record = std::make_unique<StructFieldRecord>(
104*12c85518Srobert       USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
105*12c85518Srobert       SubHeading, IsFromSystemHeader);
106*12c85518Srobert   Record->ParentInformation = APIRecord::HierarchyInformation(
107*12c85518Srobert       Struct->USR, Struct->Name, Struct->getKind(), Struct);
108*12c85518Srobert   USRBasedLookupTable.insert({USR, Record.get()});
109*12c85518Srobert   return Struct->Fields.emplace_back(std::move(Record)).get();
110*12c85518Srobert }
111*12c85518Srobert 
addStruct(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)112*12c85518Srobert StructRecord *APISet::addStruct(StringRef Name, StringRef USR, PresumedLoc Loc,
113*12c85518Srobert                                 AvailabilitySet Availabilities,
114*12c85518Srobert                                 const DocComment &Comment,
115*12c85518Srobert                                 DeclarationFragments Declaration,
116*12c85518Srobert                                 DeclarationFragments SubHeading,
117*12c85518Srobert                                 bool IsFromSystemHeader) {
118*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, Structs, USR, Name, Loc,
119*12c85518Srobert                            std::move(Availabilities), Comment, Declaration,
120*12c85518Srobert                            SubHeading, IsFromSystemHeader);
121*12c85518Srobert }
122*12c85518Srobert 
addObjCCategory(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference Interface,bool IsFromSystemHeader)123*12c85518Srobert ObjCCategoryRecord *APISet::addObjCCategory(
124*12c85518Srobert     StringRef Name, StringRef USR, PresumedLoc Loc,
125*12c85518Srobert     AvailabilitySet Availabilities, const DocComment &Comment,
126*12c85518Srobert     DeclarationFragments Declaration, DeclarationFragments SubHeading,
127*12c85518Srobert     SymbolReference Interface, bool IsFromSystemHeader) {
128*12c85518Srobert   // Create the category record.
129*12c85518Srobert   auto *Record =
130*12c85518Srobert       addTopLevelRecord(USRBasedLookupTable, ObjCCategories, USR, Name, Loc,
131*12c85518Srobert                         std::move(Availabilities), Comment, Declaration,
132*12c85518Srobert                         SubHeading, Interface, IsFromSystemHeader);
133*12c85518Srobert 
134*12c85518Srobert   // If this category is extending a known interface, associate it with the
135*12c85518Srobert   // ObjCInterfaceRecord.
136*12c85518Srobert   auto It = ObjCInterfaces.find(Interface.USR);
137*12c85518Srobert   if (It != ObjCInterfaces.end())
138*12c85518Srobert     It->second->Categories.push_back(Record);
139*12c85518Srobert 
140*12c85518Srobert   return Record;
141*12c85518Srobert }
142*12c85518Srobert 
143*12c85518Srobert ObjCInterfaceRecord *
addObjCInterface(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,LinkageInfo Linkage,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference SuperClass,bool IsFromSystemHeader)144*12c85518Srobert APISet::addObjCInterface(StringRef Name, StringRef USR, PresumedLoc Loc,
145*12c85518Srobert                          AvailabilitySet Availabilities, LinkageInfo Linkage,
146*12c85518Srobert                          const DocComment &Comment,
147*12c85518Srobert                          DeclarationFragments Declaration,
148*12c85518Srobert                          DeclarationFragments SubHeading,
149*12c85518Srobert                          SymbolReference SuperClass, bool IsFromSystemHeader) {
150*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, ObjCInterfaces, USR, Name, Loc,
151*12c85518Srobert                            std::move(Availabilities), Linkage, Comment,
152*12c85518Srobert                            Declaration, SubHeading, SuperClass,
153*12c85518Srobert                            IsFromSystemHeader);
154*12c85518Srobert }
155*12c85518Srobert 
addObjCMethod(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,FunctionSignature Signature,bool IsInstanceMethod,bool IsFromSystemHeader)156*12c85518Srobert ObjCMethodRecord *APISet::addObjCMethod(
157*12c85518Srobert     ObjCContainerRecord *Container, StringRef Name, StringRef USR,
158*12c85518Srobert     PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment,
159*12c85518Srobert     DeclarationFragments Declaration, DeclarationFragments SubHeading,
160*12c85518Srobert     FunctionSignature Signature, bool IsInstanceMethod,
161*12c85518Srobert     bool IsFromSystemHeader) {
162*12c85518Srobert   std::unique_ptr<ObjCMethodRecord> Record;
163*12c85518Srobert   if (IsInstanceMethod)
164*12c85518Srobert     Record = std::make_unique<ObjCInstanceMethodRecord>(
165*12c85518Srobert         USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
166*12c85518Srobert         SubHeading, Signature, IsFromSystemHeader);
167*12c85518Srobert   else
168*12c85518Srobert     Record = std::make_unique<ObjCClassMethodRecord>(
169*12c85518Srobert         USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
170*12c85518Srobert         SubHeading, Signature, IsFromSystemHeader);
171*12c85518Srobert 
172*12c85518Srobert   Record->ParentInformation = APIRecord::HierarchyInformation(
173*12c85518Srobert       Container->USR, Container->Name, Container->getKind(), Container);
174*12c85518Srobert   USRBasedLookupTable.insert({USR, Record.get()});
175*12c85518Srobert   return Container->Methods.emplace_back(std::move(Record)).get();
176*12c85518Srobert }
177*12c85518Srobert 
addObjCProperty(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,ObjCPropertyRecord::AttributeKind Attributes,StringRef GetterName,StringRef SetterName,bool IsOptional,bool IsInstanceProperty,bool IsFromSystemHeader)178*12c85518Srobert ObjCPropertyRecord *APISet::addObjCProperty(
179*12c85518Srobert     ObjCContainerRecord *Container, StringRef Name, StringRef USR,
180*12c85518Srobert     PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment,
181*12c85518Srobert     DeclarationFragments Declaration, DeclarationFragments SubHeading,
182*12c85518Srobert     ObjCPropertyRecord::AttributeKind Attributes, StringRef GetterName,
183*12c85518Srobert     StringRef SetterName, bool IsOptional, bool IsInstanceProperty,
184*12c85518Srobert     bool IsFromSystemHeader) {
185*12c85518Srobert   std::unique_ptr<ObjCPropertyRecord> Record;
186*12c85518Srobert   if (IsInstanceProperty)
187*12c85518Srobert     Record = std::make_unique<ObjCInstancePropertyRecord>(
188*12c85518Srobert         USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
189*12c85518Srobert         SubHeading, Attributes, GetterName, SetterName, IsOptional,
190*12c85518Srobert         IsFromSystemHeader);
191*12c85518Srobert   else
192*12c85518Srobert     Record = std::make_unique<ObjCClassPropertyRecord>(
193*12c85518Srobert         USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
194*12c85518Srobert         SubHeading, Attributes, GetterName, SetterName, IsOptional,
195*12c85518Srobert         IsFromSystemHeader);
196*12c85518Srobert   Record->ParentInformation = APIRecord::HierarchyInformation(
197*12c85518Srobert       Container->USR, Container->Name, Container->getKind(), Container);
198*12c85518Srobert   USRBasedLookupTable.insert({USR, Record.get()});
199*12c85518Srobert   return Container->Properties.emplace_back(std::move(Record)).get();
200*12c85518Srobert }
201*12c85518Srobert 
addObjCInstanceVariable(ObjCContainerRecord * Container,StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,ObjCInstanceVariableRecord::AccessControl Access,bool IsFromSystemHeader)202*12c85518Srobert ObjCInstanceVariableRecord *APISet::addObjCInstanceVariable(
203*12c85518Srobert     ObjCContainerRecord *Container, StringRef Name, StringRef USR,
204*12c85518Srobert     PresumedLoc Loc, AvailabilitySet Availabilities, const DocComment &Comment,
205*12c85518Srobert     DeclarationFragments Declaration, DeclarationFragments SubHeading,
206*12c85518Srobert     ObjCInstanceVariableRecord::AccessControl Access, bool IsFromSystemHeader) {
207*12c85518Srobert   auto Record = std::make_unique<ObjCInstanceVariableRecord>(
208*12c85518Srobert       USR, Name, Loc, std::move(Availabilities), Comment, Declaration,
209*12c85518Srobert       SubHeading, Access, IsFromSystemHeader);
210*12c85518Srobert   Record->ParentInformation = APIRecord::HierarchyInformation(
211*12c85518Srobert       Container->USR, Container->Name, Container->getKind(), Container);
212*12c85518Srobert   USRBasedLookupTable.insert({USR, Record.get()});
213*12c85518Srobert   return Container->Ivars.emplace_back(std::move(Record)).get();
214*12c85518Srobert }
215*12c85518Srobert 
addObjCProtocol(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)216*12c85518Srobert ObjCProtocolRecord *APISet::addObjCProtocol(StringRef Name, StringRef USR,
217*12c85518Srobert                                             PresumedLoc Loc,
218*12c85518Srobert                                             AvailabilitySet Availabilities,
219*12c85518Srobert                                             const DocComment &Comment,
220*12c85518Srobert                                             DeclarationFragments Declaration,
221*12c85518Srobert                                             DeclarationFragments SubHeading,
222*12c85518Srobert                                             bool IsFromSystemHeader) {
223*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, ObjCProtocols, USR, Name, Loc,
224*12c85518Srobert                            std::move(Availabilities), Comment, Declaration,
225*12c85518Srobert                            SubHeading, IsFromSystemHeader);
226*12c85518Srobert }
227*12c85518Srobert 
228*12c85518Srobert MacroDefinitionRecord *
addMacroDefinition(StringRef Name,StringRef USR,PresumedLoc Loc,DeclarationFragments Declaration,DeclarationFragments SubHeading,bool IsFromSystemHeader)229*12c85518Srobert APISet::addMacroDefinition(StringRef Name, StringRef USR, PresumedLoc Loc,
230*12c85518Srobert                            DeclarationFragments Declaration,
231*12c85518Srobert                            DeclarationFragments SubHeading,
232*12c85518Srobert                            bool IsFromSystemHeader) {
233*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, Macros, USR, Name, Loc,
234*12c85518Srobert                            Declaration, SubHeading, IsFromSystemHeader);
235*12c85518Srobert }
236*12c85518Srobert 
237*12c85518Srobert TypedefRecord *
addTypedef(StringRef Name,StringRef USR,PresumedLoc Loc,AvailabilitySet Availabilities,const DocComment & Comment,DeclarationFragments Declaration,DeclarationFragments SubHeading,SymbolReference UnderlyingType,bool IsFromSystemHeader)238*12c85518Srobert APISet::addTypedef(StringRef Name, StringRef USR, PresumedLoc Loc,
239*12c85518Srobert                    AvailabilitySet Availabilities, const DocComment &Comment,
240*12c85518Srobert                    DeclarationFragments Declaration,
241*12c85518Srobert                    DeclarationFragments SubHeading,
242*12c85518Srobert                    SymbolReference UnderlyingType, bool IsFromSystemHeader) {
243*12c85518Srobert   return addTopLevelRecord(USRBasedLookupTable, Typedefs, USR, Name, Loc,
244*12c85518Srobert                            std::move(Availabilities), Comment, Declaration,
245*12c85518Srobert                            SubHeading, UnderlyingType, IsFromSystemHeader);
246*12c85518Srobert }
247*12c85518Srobert 
findRecordForUSR(StringRef USR) const248*12c85518Srobert APIRecord *APISet::findRecordForUSR(StringRef USR) const {
249*12c85518Srobert   if (USR.empty())
250*12c85518Srobert     return nullptr;
251*12c85518Srobert 
252*12c85518Srobert   auto It = USRBasedLookupTable.find(USR);
253*12c85518Srobert   if (It != USRBasedLookupTable.end())
254*12c85518Srobert     return It->second;
255*12c85518Srobert   return nullptr;
256*12c85518Srobert }
257*12c85518Srobert 
recordUSR(const Decl * D)258*12c85518Srobert StringRef APISet::recordUSR(const Decl *D) {
259*12c85518Srobert   SmallString<128> USR;
260*12c85518Srobert   index::generateUSRForDecl(D, USR);
261*12c85518Srobert   return copyString(USR);
262*12c85518Srobert }
263*12c85518Srobert 
recordUSRForMacro(StringRef Name,SourceLocation SL,const SourceManager & SM)264*12c85518Srobert StringRef APISet::recordUSRForMacro(StringRef Name, SourceLocation SL,
265*12c85518Srobert                                     const SourceManager &SM) {
266*12c85518Srobert   SmallString<128> USR;
267*12c85518Srobert   index::generateUSRForMacro(Name, SL, SM, USR);
268*12c85518Srobert   return copyString(USR);
269*12c85518Srobert }
270*12c85518Srobert 
copyString(StringRef String)271*12c85518Srobert StringRef APISet::copyString(StringRef String) {
272*12c85518Srobert   if (String.empty())
273*12c85518Srobert     return {};
274*12c85518Srobert 
275*12c85518Srobert   // No need to allocate memory and copy if the string has already been stored.
276*12c85518Srobert   if (StringAllocator.identifyObject(String.data()))
277*12c85518Srobert     return String;
278*12c85518Srobert 
279*12c85518Srobert   void *Ptr = StringAllocator.Allocate(String.size(), 1);
280*12c85518Srobert   memcpy(Ptr, String.data(), String.size());
281*12c85518Srobert   return StringRef(reinterpret_cast<const char *>(Ptr), String.size());
282*12c85518Srobert }
283*12c85518Srobert 
~APIRecord()284*12c85518Srobert APIRecord::~APIRecord() {}
~ObjCContainerRecord()285*12c85518Srobert ObjCContainerRecord::~ObjCContainerRecord() {}
~ObjCMethodRecord()286*12c85518Srobert ObjCMethodRecord::~ObjCMethodRecord() {}
~ObjCPropertyRecord()287*12c85518Srobert ObjCPropertyRecord::~ObjCPropertyRecord() {}
288*12c85518Srobert 
anchor()289*12c85518Srobert void GlobalFunctionRecord::anchor() {}
anchor()290*12c85518Srobert void GlobalVariableRecord::anchor() {}
anchor()291*12c85518Srobert void EnumConstantRecord::anchor() {}
anchor()292*12c85518Srobert void EnumRecord::anchor() {}
anchor()293*12c85518Srobert void StructFieldRecord::anchor() {}
anchor()294*12c85518Srobert void StructRecord::anchor() {}
anchor()295*12c85518Srobert void ObjCInstancePropertyRecord::anchor() {}
anchor()296*12c85518Srobert void ObjCClassPropertyRecord::anchor() {}
anchor()297*12c85518Srobert void ObjCInstanceVariableRecord::anchor() {}
anchor()298*12c85518Srobert void ObjCInstanceMethodRecord::anchor() {}
anchor()299*12c85518Srobert void ObjCClassMethodRecord::anchor() {}
anchor()300*12c85518Srobert void ObjCCategoryRecord::anchor() {}
anchor()301*12c85518Srobert void ObjCInterfaceRecord::anchor() {}
anchor()302*12c85518Srobert void ObjCProtocolRecord::anchor() {}
anchor()303*12c85518Srobert void MacroDefinitionRecord::anchor() {}
anchor()304*12c85518Srobert void TypedefRecord::anchor() {}
305