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: 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 81 void traverseNamespaces() { 82 for (const auto &Namespace : API.getNamespaces()) 83 getDerived()->visitNamespaceRecord(*Namespace.second); 84 } 85 86 void traverseGlobalFunctionRecords() { 87 for (const auto &GlobalFunction : API.getGlobalFunctions()) 88 getDerived()->visitGlobalFunctionRecord(*GlobalFunction.second); 89 } 90 91 void traverseGlobalVariableRecords() { 92 for (const auto &GlobalVariable : API.getGlobalVariables()) 93 getDerived()->visitGlobalVariableRecord(*GlobalVariable.second); 94 } 95 96 void traverseEnumRecords() { 97 for (const auto &Enum : API.getEnums()) 98 getDerived()->visitEnumRecord(*Enum.second); 99 } 100 101 void traverseRecordRecords() { 102 for (const auto &Record : API.getRecords()) 103 getDerived()->visitRecordRecord(*Record.second); 104 } 105 106 void traverseStaticFieldRecords() { 107 for (const auto &StaticField : API.getStaticFields()) 108 getDerived()->visitStaticFieldRecord(*StaticField.second); 109 } 110 111 void traverseCXXClassRecords() { 112 for (const auto &Class : API.getCXXClasses()) 113 getDerived()->visitCXXClassRecord(*Class.second); 114 } 115 116 void traverseCXXMethodTemplates() { 117 for (const auto &MethodTemplate : API.getCXXMethodTemplates()) 118 getDerived()->visitMethodTemplateRecord(*MethodTemplate.second); 119 } 120 121 void traverseCXXMethodTemplateSpecializations() { 122 for (const auto &MethodTemplateSpecialization : 123 API.getCXXMethodTemplateSpecializations()) 124 getDerived()->visitMethodTemplateSpecializationRecord( 125 *MethodTemplateSpecialization.second); 126 } 127 128 void traverseClassTemplateRecords() { 129 for (const auto &ClassTemplate : API.getClassTemplates()) 130 getDerived()->visitClassTemplateRecord(*ClassTemplate.second); 131 } 132 133 void traverseClassTemplateSpecializationRecords() { 134 for (const auto &ClassTemplateSpecialization : 135 API.getClassTemplateSpecializations()) 136 getDerived()->visitClassTemplateSpecializationRecord( 137 *ClassTemplateSpecialization.second); 138 } 139 140 void traverseClassTemplatePartialSpecializationRecords() { 141 for (const auto &ClassTemplatePartialSpecialization : 142 API.getClassTemplatePartialSpecializations()) 143 getDerived()->visitClassTemplatePartialSpecializationRecord( 144 *ClassTemplatePartialSpecialization.second); 145 } 146 147 void traverseCXXInstanceMethods() { 148 for (const auto &InstanceMethod : API.getCXXInstanceMethods()) 149 getDerived()->visitCXXInstanceMethodRecord(*InstanceMethod.second); 150 } 151 152 void traverseCXXStaticMethods() { 153 for (const auto &InstanceMethod : API.getCXXStaticMethods()) 154 getDerived()->visitCXXStaticMethodRecord(*InstanceMethod.second); 155 } 156 157 void traverseCXXFields() { 158 for (const auto &CXXField : API.getCXXFields()) 159 getDerived()->visitCXXFieldRecord(*CXXField.second); 160 } 161 162 void traverseCXXFieldTemplates() { 163 for (const auto &CXXFieldTemplate : API.getCXXFieldTemplates()) 164 getDerived()->visitCXXFieldTemplateRecord(*CXXFieldTemplate.second); 165 } 166 167 void traverseGlobalVariableTemplateRecords() { 168 for (const auto &GlobalVariableTemplate : API.getGlobalVariableTemplates()) 169 getDerived()->visitGlobalVariableTemplateRecord( 170 *GlobalVariableTemplate.second); 171 } 172 173 void traverseGlobalVariableTemplateSpecializationRecords() { 174 for (const auto &GlobalVariableTemplateSpecialization : 175 API.getGlobalVariableTemplateSpecializations()) 176 getDerived()->visitGlobalVariableTemplateSpecializationRecord( 177 *GlobalVariableTemplateSpecialization.second); 178 } 179 180 void traverseGlobalVariableTemplatePartialSpecializationRecords() { 181 for (const auto &GlobalVariableTemplatePartialSpecialization : 182 API.getGlobalVariableTemplatePartialSpecializations()) 183 getDerived()->visitGlobalVariableTemplatePartialSpecializationRecord( 184 *GlobalVariableTemplatePartialSpecialization.second); 185 } 186 187 void traverseGlobalFunctionTemplateRecords() { 188 for (const auto &GlobalFunctionTemplate : API.getGlobalFunctionTemplates()) 189 getDerived()->visitGlobalFunctionTemplateRecord( 190 *GlobalFunctionTemplate.second); 191 } 192 193 void traverseGlobalFunctionTemplateSpecializationRecords() { 194 for (const auto &GlobalFunctionTemplateSpecialization : 195 API.getGlobalFunctionTemplateSpecializations()) 196 getDerived()->visitGlobalFunctionTemplateSpecializationRecord( 197 *GlobalFunctionTemplateSpecialization.second); 198 } 199 200 void traverseConcepts() { 201 for (const auto &Concept : API.getConcepts()) 202 getDerived()->visitConceptRecord(*Concept.second); 203 } 204 205 void traverseObjCInterfaces() { 206 for (const auto &Interface : API.getObjCInterfaces()) 207 getDerived()->visitObjCContainerRecord(*Interface.second); 208 } 209 210 void traverseObjCProtocols() { 211 for (const auto &Protocol : API.getObjCProtocols()) 212 getDerived()->visitObjCContainerRecord(*Protocol.second); 213 } 214 215 void traverseObjCCategories() { 216 for (const auto &Category : API.getObjCCategories()) 217 getDerived()->visitObjCCategoryRecord(*Category.second); 218 } 219 220 void traverseMacroDefinitionRecords() { 221 for (const auto &Macro : API.getMacros()) 222 getDerived()->visitMacroDefinitionRecord(*Macro.second); 223 } 224 225 void traverseTypedefRecords() { 226 for (const auto &Typedef : API.getTypedefs()) 227 getDerived()->visitTypedefRecord(*Typedef.second); 228 } 229 230 void visitNamespaceRecord(const NamespaceRecord &Record){}; 231 232 /// Visit a global function record. 233 void visitGlobalFunctionRecord(const GlobalFunctionRecord &Record){}; 234 235 /// Visit a global variable record. 236 void visitGlobalVariableRecord(const GlobalVariableRecord &Record){}; 237 238 /// Visit an enum record. 239 void visitEnumRecord(const EnumRecord &Record){}; 240 241 /// Visit a record record. 242 void visitRecordRecord(const RecordRecord &Record){}; 243 244 void visitStaticFieldRecord(const StaticFieldRecord &Record){}; 245 246 void visitCXXClassRecord(const CXXClassRecord &Record){}; 247 248 void visitClassTemplateRecord(const ClassTemplateRecord &Record){}; 249 250 void visitClassTemplateSpecializationRecord( 251 const ClassTemplateSpecializationRecord &Record){}; 252 253 void visitClassTemplatePartialSpecializationRecord( 254 const ClassTemplatePartialSpecializationRecord &Record){}; 255 256 void visitCXXInstanceRecord(const CXXInstanceMethodRecord &Record){}; 257 258 void visitCXXStaticRecord(const CXXStaticMethodRecord &Record){}; 259 260 void visitMethodTemplateRecord(const CXXMethodTemplateRecord &Record){}; 261 262 void visitMethodTemplateSpecializationRecord( 263 const CXXMethodTemplateSpecializationRecord &Record){}; 264 265 void visitCXXFieldTemplateRecord(const CXXFieldTemplateRecord &Record){}; 266 267 void visitGlobalVariableTemplateRecord( 268 const GlobalVariableTemplateRecord &Record) {} 269 270 void visitGlobalVariableTemplateSpecializationRecord( 271 const GlobalVariableTemplateSpecializationRecord &Record){}; 272 273 void visitGlobalVariableTemplatePartialSpecializationRecord( 274 const GlobalVariableTemplatePartialSpecializationRecord &Record){}; 275 276 void visitGlobalFunctionTemplateRecord( 277 const GlobalFunctionTemplateRecord &Record){}; 278 279 void visitGlobalFunctionTemplateSpecializationRecord( 280 const GlobalFunctionTemplateSpecializationRecord &Record){}; 281 282 /// Visit an Objective-C container record. 283 void visitObjCContainerRecord(const ObjCContainerRecord &Record){}; 284 285 /// Visit an Objective-C category record. 286 void visitObjCCategoryRecord(const ObjCCategoryRecord &Record){}; 287 288 /// Visit a macro definition record. 289 void visitMacroDefinitionRecord(const MacroDefinitionRecord &Record){}; 290 291 /// Visit a typedef 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: 305 APISetVisitor(const APISet &API) : API(API) {} 306 ~APISetVisitor() = default; 307 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