1 //===- ExtractAPI/Serialization/SerializerBase.h ----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file defines the ExtractAPI APISetVisitor interface. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_EXTRACTAPI_SERIALIZATION_SERIALIZERBASE_H 15 #define LLVM_CLANG_EXTRACTAPI_SERIALIZATION_SERIALIZERBASE_H 16 17 #include "clang/ExtractAPI/API.h" 18 19 namespace clang { 20 namespace extractapi { 21 22 /// The base interface of visitors for API information. 23 template <typename Derived> class APISetVisitor { 24 public: traverseAPISet()25 void traverseAPISet() { 26 getDerived()->traverseNamespaces(); 27 28 getDerived()->traverseGlobalVariableRecords(); 29 30 getDerived()->traverseGlobalFunctionRecords(); 31 32 getDerived()->traverseEnumRecords(); 33 34 getDerived()->traverseStaticFieldRecords(); 35 36 getDerived()->traverseCXXClassRecords(); 37 38 getDerived()->traverseClassTemplateRecords(); 39 40 getDerived()->traverseClassTemplateSpecializationRecords(); 41 42 getDerived()->traverseClassTemplatePartialSpecializationRecords(); 43 44 getDerived()->traverseCXXInstanceMethods(); 45 46 getDerived()->traverseCXXStaticMethods(); 47 48 getDerived()->traverseCXXMethodTemplates(); 49 50 getDerived()->traverseCXXMethodTemplateSpecializations(); 51 52 getDerived()->traverseCXXFields(); 53 54 getDerived()->traverseCXXFieldTemplates(); 55 56 getDerived()->traverseConcepts(); 57 58 getDerived()->traverseGlobalVariableTemplateRecords(); 59 60 getDerived()->traverseGlobalVariableTemplateSpecializationRecords(); 61 62 getDerived()->traverseGlobalVariableTemplatePartialSpecializationRecords(); 63 64 getDerived()->traverseGlobalFunctionTemplateRecords(); 65 66 getDerived()->traverseGlobalFunctionTemplateSpecializationRecords(); 67 68 getDerived()->traverseRecordRecords(); 69 70 getDerived()->traverseObjCInterfaces(); 71 72 getDerived()->traverseObjCProtocols(); 73 74 getDerived()->traverseObjCCategories(); 75 76 getDerived()->traverseMacroDefinitionRecords(); 77 78 getDerived()->traverseTypedefRecords(); 79 } 80 traverseNamespaces()81 void traverseNamespaces() { 82 for (const auto &Namespace : API.getNamespaces()) 83 getDerived()->visitNamespaceRecord(*Namespace.second); 84 } 85 traverseGlobalFunctionRecords()86 void traverseGlobalFunctionRecords() { 87 for (const auto &GlobalFunction : API.getGlobalFunctions()) 88 getDerived()->visitGlobalFunctionRecord(*GlobalFunction.second); 89 } 90 traverseGlobalVariableRecords()91 void traverseGlobalVariableRecords() { 92 for (const auto &GlobalVariable : API.getGlobalVariables()) 93 getDerived()->visitGlobalVariableRecord(*GlobalVariable.second); 94 } 95 traverseEnumRecords()96 void traverseEnumRecords() { 97 for (const auto &Enum : API.getEnums()) 98 getDerived()->visitEnumRecord(*Enum.second); 99 } 100 traverseRecordRecords()101 void traverseRecordRecords() { 102 for (const auto &Record : API.getRecords()) 103 getDerived()->visitRecordRecord(*Record.second); 104 } 105 traverseStaticFieldRecords()106 void traverseStaticFieldRecords() { 107 for (const auto &StaticField : API.getStaticFields()) 108 getDerived()->visitStaticFieldRecord(*StaticField.second); 109 } 110 traverseCXXClassRecords()111 void traverseCXXClassRecords() { 112 for (const auto &Class : API.getCXXClasses()) 113 getDerived()->visitCXXClassRecord(*Class.second); 114 } 115 traverseCXXMethodTemplates()116 void traverseCXXMethodTemplates() { 117 for (const auto &MethodTemplate : API.getCXXMethodTemplates()) 118 getDerived()->visitMethodTemplateRecord(*MethodTemplate.second); 119 } 120 traverseCXXMethodTemplateSpecializations()121 void traverseCXXMethodTemplateSpecializations() { 122 for (const auto &MethodTemplateSpecialization : 123 API.getCXXMethodTemplateSpecializations()) 124 getDerived()->visitMethodTemplateSpecializationRecord( 125 *MethodTemplateSpecialization.second); 126 } 127 traverseClassTemplateRecords()128 void traverseClassTemplateRecords() { 129 for (const auto &ClassTemplate : API.getClassTemplates()) 130 getDerived()->visitClassTemplateRecord(*ClassTemplate.second); 131 } 132 traverseClassTemplateSpecializationRecords()133 void traverseClassTemplateSpecializationRecords() { 134 for (const auto &ClassTemplateSpecialization : 135 API.getClassTemplateSpecializations()) 136 getDerived()->visitClassTemplateSpecializationRecord( 137 *ClassTemplateSpecialization.second); 138 } 139 traverseClassTemplatePartialSpecializationRecords()140 void traverseClassTemplatePartialSpecializationRecords() { 141 for (const auto &ClassTemplatePartialSpecialization : 142 API.getClassTemplatePartialSpecializations()) 143 getDerived()->visitClassTemplatePartialSpecializationRecord( 144 *ClassTemplatePartialSpecialization.second); 145 } 146 traverseCXXInstanceMethods()147 void traverseCXXInstanceMethods() { 148 for (const auto &InstanceMethod : API.getCXXInstanceMethods()) 149 getDerived()->visitCXXInstanceMethodRecord(*InstanceMethod.second); 150 } 151 traverseCXXStaticMethods()152 void traverseCXXStaticMethods() { 153 for (const auto &InstanceMethod : API.getCXXStaticMethods()) 154 getDerived()->visitCXXStaticMethodRecord(*InstanceMethod.second); 155 } 156 traverseCXXFields()157 void traverseCXXFields() { 158 for (const auto &CXXField : API.getCXXFields()) 159 getDerived()->visitCXXFieldRecord(*CXXField.second); 160 } 161 traverseCXXFieldTemplates()162 void traverseCXXFieldTemplates() { 163 for (const auto &CXXFieldTemplate : API.getCXXFieldTemplates()) 164 getDerived()->visitCXXFieldTemplateRecord(*CXXFieldTemplate.second); 165 } 166 traverseGlobalVariableTemplateRecords()167 void traverseGlobalVariableTemplateRecords() { 168 for (const auto &GlobalVariableTemplate : API.getGlobalVariableTemplates()) 169 getDerived()->visitGlobalVariableTemplateRecord( 170 *GlobalVariableTemplate.second); 171 } 172 traverseGlobalVariableTemplateSpecializationRecords()173 void traverseGlobalVariableTemplateSpecializationRecords() { 174 for (const auto &GlobalVariableTemplateSpecialization : 175 API.getGlobalVariableTemplateSpecializations()) 176 getDerived()->visitGlobalVariableTemplateSpecializationRecord( 177 *GlobalVariableTemplateSpecialization.second); 178 } 179 traverseGlobalVariableTemplatePartialSpecializationRecords()180 void traverseGlobalVariableTemplatePartialSpecializationRecords() { 181 for (const auto &GlobalVariableTemplatePartialSpecialization : 182 API.getGlobalVariableTemplatePartialSpecializations()) 183 getDerived()->visitGlobalVariableTemplatePartialSpecializationRecord( 184 *GlobalVariableTemplatePartialSpecialization.second); 185 } 186 traverseGlobalFunctionTemplateRecords()187 void traverseGlobalFunctionTemplateRecords() { 188 for (const auto &GlobalFunctionTemplate : API.getGlobalFunctionTemplates()) 189 getDerived()->visitGlobalFunctionTemplateRecord( 190 *GlobalFunctionTemplate.second); 191 } 192 traverseGlobalFunctionTemplateSpecializationRecords()193 void traverseGlobalFunctionTemplateSpecializationRecords() { 194 for (const auto &GlobalFunctionTemplateSpecialization : 195 API.getGlobalFunctionTemplateSpecializations()) 196 getDerived()->visitGlobalFunctionTemplateSpecializationRecord( 197 *GlobalFunctionTemplateSpecialization.second); 198 } 199 traverseConcepts()200 void traverseConcepts() { 201 for (const auto &Concept : API.getConcepts()) 202 getDerived()->visitConceptRecord(*Concept.second); 203 } 204 traverseObjCInterfaces()205 void traverseObjCInterfaces() { 206 for (const auto &Interface : API.getObjCInterfaces()) 207 getDerived()->visitObjCContainerRecord(*Interface.second); 208 } 209 traverseObjCProtocols()210 void traverseObjCProtocols() { 211 for (const auto &Protocol : API.getObjCProtocols()) 212 getDerived()->visitObjCContainerRecord(*Protocol.second); 213 } 214 traverseObjCCategories()215 void traverseObjCCategories() { 216 for (const auto &Category : API.getObjCCategories()) 217 getDerived()->visitObjCCategoryRecord(*Category.second); 218 } 219 traverseMacroDefinitionRecords()220 void traverseMacroDefinitionRecords() { 221 for (const auto &Macro : API.getMacros()) 222 getDerived()->visitMacroDefinitionRecord(*Macro.second); 223 } 224 traverseTypedefRecords()225 void traverseTypedefRecords() { 226 for (const auto &Typedef : API.getTypedefs()) 227 getDerived()->visitTypedefRecord(*Typedef.second); 228 } 229 visitNamespaceRecord(const NamespaceRecord & Record)230 void visitNamespaceRecord(const NamespaceRecord &Record){}; 231 232 /// Visit a global function record. visitGlobalFunctionRecord(const GlobalFunctionRecord & Record)233 void visitGlobalFunctionRecord(const GlobalFunctionRecord &Record){}; 234 235 /// Visit a global variable record. visitGlobalVariableRecord(const GlobalVariableRecord & Record)236 void visitGlobalVariableRecord(const GlobalVariableRecord &Record){}; 237 238 /// Visit an enum record. visitEnumRecord(const EnumRecord & Record)239 void visitEnumRecord(const EnumRecord &Record){}; 240 241 /// Visit a record record. visitRecordRecord(const RecordRecord & Record)242 void visitRecordRecord(const RecordRecord &Record){}; 243 visitStaticFieldRecord(const StaticFieldRecord & Record)244 void visitStaticFieldRecord(const StaticFieldRecord &Record){}; 245 visitCXXClassRecord(const CXXClassRecord & Record)246 void visitCXXClassRecord(const CXXClassRecord &Record){}; 247 visitClassTemplateRecord(const ClassTemplateRecord & Record)248 void visitClassTemplateRecord(const ClassTemplateRecord &Record){}; 249 visitClassTemplateSpecializationRecord(const ClassTemplateSpecializationRecord & Record)250 void visitClassTemplateSpecializationRecord( 251 const ClassTemplateSpecializationRecord &Record){}; 252 visitClassTemplatePartialSpecializationRecord(const ClassTemplatePartialSpecializationRecord & Record)253 void visitClassTemplatePartialSpecializationRecord( 254 const ClassTemplatePartialSpecializationRecord &Record){}; 255 visitCXXInstanceRecord(const CXXInstanceMethodRecord & Record)256 void visitCXXInstanceRecord(const CXXInstanceMethodRecord &Record){}; 257 visitCXXStaticRecord(const CXXStaticMethodRecord & Record)258 void visitCXXStaticRecord(const CXXStaticMethodRecord &Record){}; 259 visitMethodTemplateRecord(const CXXMethodTemplateRecord & Record)260 void visitMethodTemplateRecord(const CXXMethodTemplateRecord &Record){}; 261 visitMethodTemplateSpecializationRecord(const CXXMethodTemplateSpecializationRecord & Record)262 void visitMethodTemplateSpecializationRecord( 263 const CXXMethodTemplateSpecializationRecord &Record){}; 264 visitCXXFieldTemplateRecord(const CXXFieldTemplateRecord & Record)265 void visitCXXFieldTemplateRecord(const CXXFieldTemplateRecord &Record){}; 266 visitGlobalVariableTemplateRecord(const GlobalVariableTemplateRecord & Record)267 void visitGlobalVariableTemplateRecord( 268 const GlobalVariableTemplateRecord &Record) {} 269 visitGlobalVariableTemplateSpecializationRecord(const GlobalVariableTemplateSpecializationRecord & Record)270 void visitGlobalVariableTemplateSpecializationRecord( 271 const GlobalVariableTemplateSpecializationRecord &Record){}; 272 visitGlobalVariableTemplatePartialSpecializationRecord(const GlobalVariableTemplatePartialSpecializationRecord & Record)273 void visitGlobalVariableTemplatePartialSpecializationRecord( 274 const GlobalVariableTemplatePartialSpecializationRecord &Record){}; 275 visitGlobalFunctionTemplateRecord(const GlobalFunctionTemplateRecord & Record)276 void visitGlobalFunctionTemplateRecord( 277 const GlobalFunctionTemplateRecord &Record){}; 278 visitGlobalFunctionTemplateSpecializationRecord(const GlobalFunctionTemplateSpecializationRecord & Record)279 void visitGlobalFunctionTemplateSpecializationRecord( 280 const GlobalFunctionTemplateSpecializationRecord &Record){}; 281 282 /// Visit an Objective-C container record. visitObjCContainerRecord(const ObjCContainerRecord & Record)283 void visitObjCContainerRecord(const ObjCContainerRecord &Record){}; 284 285 /// Visit an Objective-C category record. visitObjCCategoryRecord(const ObjCCategoryRecord & Record)286 void visitObjCCategoryRecord(const ObjCCategoryRecord &Record){}; 287 288 /// Visit a macro definition record. visitMacroDefinitionRecord(const MacroDefinitionRecord & Record)289 void visitMacroDefinitionRecord(const MacroDefinitionRecord &Record){}; 290 291 /// Visit a typedef record. visitTypedefRecord(const TypedefRecord & Record)292 void visitTypedefRecord(const TypedefRecord &Record){}; 293 294 protected: 295 const APISet &API; 296 297 public: 298 APISetVisitor() = delete; 299 APISetVisitor(const APISetVisitor &) = delete; 300 APISetVisitor(APISetVisitor &&) = delete; 301 APISetVisitor &operator=(const APISetVisitor &) = delete; 302 APISetVisitor &operator=(APISetVisitor &&) = delete; 303 304 protected: APISetVisitor(const APISet & API)305 APISetVisitor(const APISet &API) : API(API) {} 306 ~APISetVisitor() = default; 307 getDerived()308 Derived *getDerived() { return static_cast<Derived *>(this); }; 309 }; 310 311 } // namespace extractapi 312 } // namespace clang 313 314 #endif // LLVM_CLANG_EXTRACTAPI_SERIALIZATION_SERIALIZERBASE_H 315