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