Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |
2 | |* *| |
||
3 | |* Helper classes for BasicReaders *| |
||
4 | |* *| |
||
5 | |* Automatically generated file, do not edit! *| |
||
6 | |* *| |
||
7 | \*===----------------------------------------------------------------------===*/ |
||
8 | |||
9 | template <class ValueType> |
||
10 | struct ReadDispatcher; |
||
11 | template <> |
||
12 | struct ReadDispatcher<llvm::APInt> { |
||
13 | template <class BasicReader, class... Args> |
||
14 | static llvm::APInt read(BasicReader &R, Args &&... args) { |
||
15 | return R.readAPInt(std::forward<Args>(args)...); |
||
16 | } |
||
17 | }; |
||
18 | template <> |
||
19 | struct ReadDispatcher<llvm::APSInt> { |
||
20 | template <class BasicReader, class... Args> |
||
21 | static llvm::APSInt read(BasicReader &R, Args &&... args) { |
||
22 | return R.readAPSInt(std::forward<Args>(args)...); |
||
23 | } |
||
24 | }; |
||
25 | template <> |
||
26 | struct ReadDispatcher<APValue> { |
||
27 | template <class BasicReader, class... Args> |
||
28 | static APValue read(BasicReader &R, Args &&... args) { |
||
29 | return R.readAPValue(std::forward<Args>(args)...); |
||
30 | } |
||
31 | }; |
||
32 | template <> |
||
33 | struct ReadDispatcher<APValue::ValueKind> { |
||
34 | template <class BasicReader, class... Args> |
||
35 | static APValue::ValueKind read(BasicReader &R, Args &&... args) { |
||
36 | return R.readAPValueKind(std::forward<Args>(args)...); |
||
37 | } |
||
38 | }; |
||
39 | template <> |
||
40 | struct ReadDispatcher<ArrayType::ArraySizeModifier> { |
||
41 | template <class BasicReader, class... Args> |
||
42 | static ArrayType::ArraySizeModifier read(BasicReader &R, Args &&... args) { |
||
43 | return R.readArraySizeModifier(std::forward<Args>(args)...); |
||
44 | } |
||
45 | }; |
||
46 | template <> |
||
47 | struct ReadDispatcher<attr::Kind> { |
||
48 | template <class BasicReader, class... Args> |
||
49 | static attr::Kind read(BasicReader &R, Args &&... args) { |
||
50 | return R.readAttrKind(std::forward<Args>(args)...); |
||
51 | } |
||
52 | }; |
||
53 | template <> |
||
54 | struct ReadDispatcher<AutoTypeKeyword> { |
||
55 | template <class BasicReader, class... Args> |
||
56 | static AutoTypeKeyword read(BasicReader &R, Args &&... args) { |
||
57 | return R.readAutoTypeKeyword(std::forward<Args>(args)...); |
||
58 | } |
||
59 | }; |
||
60 | template <> |
||
61 | struct ReadDispatcher<const BTFTypeTagAttr *> { |
||
62 | template <class BasicReader, class... Args> |
||
63 | static const BTFTypeTagAttr * read(BasicReader &R, Args &&... args) { |
||
64 | return R.readBTFTypeTagAttr(std::forward<Args>(args)...); |
||
65 | } |
||
66 | }; |
||
67 | template <> |
||
68 | struct ReadDispatcher<bool> { |
||
69 | template <class BasicReader, class... Args> |
||
70 | static bool read(BasicReader &R, Args &&... args) { |
||
71 | return R.readBool(std::forward<Args>(args)...); |
||
72 | } |
||
73 | }; |
||
74 | template <> |
||
75 | struct ReadDispatcher<BuiltinType::Kind> { |
||
76 | template <class BasicReader, class... Args> |
||
77 | static BuiltinType::Kind read(BasicReader &R, Args &&... args) { |
||
78 | return R.readBuiltinTypeKind(std::forward<Args>(args)...); |
||
79 | } |
||
80 | }; |
||
81 | template <> |
||
82 | struct ReadDispatcher<CXXRecordDecl*> { |
||
83 | template <class BasicReader, class... Args> |
||
84 | static CXXRecordDecl* read(BasicReader &R, Args &&... args) { |
||
85 | return R.readCXXRecordDeclRef(std::forward<Args>(args)...); |
||
86 | } |
||
87 | }; |
||
88 | template <> |
||
89 | struct ReadDispatcher<CallingConv> { |
||
90 | template <class BasicReader, class... Args> |
||
91 | static CallingConv read(BasicReader &R, Args &&... args) { |
||
92 | return R.readCallingConv(std::forward<Args>(args)...); |
||
93 | } |
||
94 | }; |
||
95 | template <> |
||
96 | struct ReadDispatcher<ConceptDecl*> { |
||
97 | template <class BasicReader, class... Args> |
||
98 | static ConceptDecl* read(BasicReader &R, Args &&... args) { |
||
99 | return R.readConceptDeclRef(std::forward<Args>(args)...); |
||
100 | } |
||
101 | }; |
||
102 | template <> |
||
103 | struct ReadDispatcher<Decl*> { |
||
104 | template <class BasicReader, class... Args> |
||
105 | static Decl* read(BasicReader &R, Args &&... args) { |
||
106 | return R.readDeclRef(std::forward<Args>(args)...); |
||
107 | } |
||
108 | }; |
||
109 | template <> |
||
110 | struct ReadDispatcher<DeclarationName> { |
||
111 | template <class BasicReader, class... Args> |
||
112 | static DeclarationName read(BasicReader &R, Args &&... args) { |
||
113 | return R.readDeclarationName(std::forward<Args>(args)...); |
||
114 | } |
||
115 | }; |
||
116 | template <> |
||
117 | struct ReadDispatcher<DeclarationName::NameKind> { |
||
118 | template <class BasicReader, class... Args> |
||
119 | static DeclarationName::NameKind read(BasicReader &R, Args &&... args) { |
||
120 | return R.readDeclarationNameKind(std::forward<Args>(args)...); |
||
121 | } |
||
122 | }; |
||
123 | template <> |
||
124 | struct ReadDispatcher<ElaboratedTypeKeyword> { |
||
125 | template <class BasicReader, class... Args> |
||
126 | static ElaboratedTypeKeyword read(BasicReader &R, Args &&... args) { |
||
127 | return R.readElaboratedTypeKeyword(std::forward<Args>(args)...); |
||
128 | } |
||
129 | }; |
||
130 | template <> |
||
131 | struct ReadDispatcher<FunctionProtoType::ExceptionSpecInfo> { |
||
132 | template <class BasicReader, class... Args> |
||
133 | static FunctionProtoType::ExceptionSpecInfo read(BasicReader &R, Args &&... args) { |
||
134 | return R.readExceptionSpecInfo(std::forward<Args>(args)...); |
||
135 | } |
||
136 | }; |
||
137 | template <> |
||
138 | struct ReadDispatcher<Expr*> { |
||
139 | template <class BasicReader, class... Args> |
||
140 | static Expr* read(BasicReader &R, Args &&... args) { |
||
141 | return R.readExprRef(std::forward<Args>(args)...); |
||
142 | } |
||
143 | }; |
||
144 | template <> |
||
145 | struct ReadDispatcher<FunctionProtoType::ExtParameterInfo> { |
||
146 | template <class BasicReader, class... Args> |
||
147 | static FunctionProtoType::ExtParameterInfo read(BasicReader &R, Args &&... args) { |
||
148 | return R.readExtParameterInfo(std::forward<Args>(args)...); |
||
149 | } |
||
150 | }; |
||
151 | template <> |
||
152 | struct ReadDispatcher<llvm::FixedPointSemantics> { |
||
153 | template <class BasicReader, class... Args> |
||
154 | static llvm::FixedPointSemantics read(BasicReader &R, Args &&... args) { |
||
155 | return R.readFixedPointSemantics(std::forward<Args>(args)...); |
||
156 | } |
||
157 | }; |
||
158 | template <> |
||
159 | struct ReadDispatcher<FunctionDecl*> { |
||
160 | template <class BasicReader, class... Args> |
||
161 | static FunctionDecl* read(BasicReader &R, Args &&... args) { |
||
162 | return R.readFunctionDeclRef(std::forward<Args>(args)...); |
||
163 | } |
||
164 | }; |
||
165 | template <> |
||
166 | struct ReadDispatcher<IdentifierInfo*> { |
||
167 | template <class BasicReader, class... Args> |
||
168 | static IdentifierInfo* read(BasicReader &R, Args &&... args) { |
||
169 | return R.readIdentifier(std::forward<Args>(args)...); |
||
170 | } |
||
171 | }; |
||
172 | template <> |
||
173 | struct ReadDispatcher<APValue::LValuePathEntry> { |
||
174 | template <class BasicReader, class... Args> |
||
175 | static APValue::LValuePathEntry read(BasicReader &R, Args &&... args) { |
||
176 | return R.readLValuePathEntry(std::forward<Args>(args)...); |
||
177 | } |
||
178 | }; |
||
179 | template <> |
||
180 | struct ReadDispatcher<APValue::LValuePathSerializationHelper> { |
||
181 | template <class BasicReader, class... Args> |
||
182 | static APValue::LValuePathSerializationHelper read(BasicReader &R, Args &&... args) { |
||
183 | return R.readLValuePathSerializationHelper(std::forward<Args>(args)...); |
||
184 | } |
||
185 | }; |
||
186 | template <> |
||
187 | struct ReadDispatcher<NamedDecl*> { |
||
188 | template <class BasicReader, class... Args> |
||
189 | static NamedDecl* read(BasicReader &R, Args &&... args) { |
||
190 | return R.readNamedDeclRef(std::forward<Args>(args)...); |
||
191 | } |
||
192 | }; |
||
193 | template <> |
||
194 | struct ReadDispatcher<NamespaceAliasDecl*> { |
||
195 | template <class BasicReader, class... Args> |
||
196 | static NamespaceAliasDecl* read(BasicReader &R, Args &&... args) { |
||
197 | return R.readNamespaceAliasDeclRef(std::forward<Args>(args)...); |
||
198 | } |
||
199 | }; |
||
200 | template <> |
||
201 | struct ReadDispatcher<NamespaceDecl*> { |
||
202 | template <class BasicReader, class... Args> |
||
203 | static NamespaceDecl* read(BasicReader &R, Args &&... args) { |
||
204 | return R.readNamespaceDeclRef(std::forward<Args>(args)...); |
||
205 | } |
||
206 | }; |
||
207 | template <> |
||
208 | struct ReadDispatcher<NestedNameSpecifier *> { |
||
209 | template <class BasicReader, class... Args> |
||
210 | static NestedNameSpecifier * read(BasicReader &R, Args &&... args) { |
||
211 | return R.readNestedNameSpecifier(std::forward<Args>(args)...); |
||
212 | } |
||
213 | }; |
||
214 | template <> |
||
215 | struct ReadDispatcher<NestedNameSpecifier::SpecifierKind> { |
||
216 | template <class BasicReader, class... Args> |
||
217 | static NestedNameSpecifier::SpecifierKind read(BasicReader &R, Args &&... args) { |
||
218 | return R.readNestedNameSpecifierKind(std::forward<Args>(args)...); |
||
219 | } |
||
220 | }; |
||
221 | template <> |
||
222 | struct ReadDispatcher<ObjCProtocolDecl*> { |
||
223 | template <class BasicReader, class... Args> |
||
224 | static ObjCProtocolDecl* read(BasicReader &R, Args &&... args) { |
||
225 | return R.readObjCProtocolDeclRef(std::forward<Args>(args)...); |
||
226 | } |
||
227 | }; |
||
228 | template <> |
||
229 | struct ReadDispatcher<ObjCTypeParamDecl*> { |
||
230 | template <class BasicReader, class... Args> |
||
231 | static ObjCTypeParamDecl* read(BasicReader &R, Args &&... args) { |
||
232 | return R.readObjCTypeParamDeclRef(std::forward<Args>(args)...); |
||
233 | } |
||
234 | }; |
||
235 | template <> |
||
236 | struct ReadDispatcher<OverloadedOperatorKind> { |
||
237 | template <class BasicReader, class... Args> |
||
238 | static OverloadedOperatorKind read(BasicReader &R, Args &&... args) { |
||
239 | return R.readOverloadedOperatorKind(std::forward<Args>(args)...); |
||
240 | } |
||
241 | }; |
||
242 | template <> |
||
243 | struct ReadDispatcher<QualType> { |
||
244 | template <class BasicReader, class... Args> |
||
245 | static QualType read(BasicReader &R, Args &&... args) { |
||
246 | return R.readQualType(std::forward<Args>(args)...); |
||
247 | } |
||
248 | }; |
||
249 | template <> |
||
250 | struct ReadDispatcher<Qualifiers> { |
||
251 | template <class BasicReader, class... Args> |
||
252 | static Qualifiers read(BasicReader &R, Args &&... args) { |
||
253 | return R.readQualifiers(std::forward<Args>(args)...); |
||
254 | } |
||
255 | }; |
||
256 | template <> |
||
257 | struct ReadDispatcher<RefQualifierKind> { |
||
258 | template <class BasicReader, class... Args> |
||
259 | static RefQualifierKind read(BasicReader &R, Args &&... args) { |
||
260 | return R.readRefQualifierKind(std::forward<Args>(args)...); |
||
261 | } |
||
262 | }; |
||
263 | template <> |
||
264 | struct ReadDispatcher<Selector> { |
||
265 | template <class BasicReader, class... Args> |
||
266 | static Selector read(BasicReader &R, Args &&... args) { |
||
267 | return R.readSelector(std::forward<Args>(args)...); |
||
268 | } |
||
269 | }; |
||
270 | template <> |
||
271 | struct ReadDispatcher<SourceLocation> { |
||
272 | template <class BasicReader, class... Args> |
||
273 | static SourceLocation read(BasicReader &R, Args &&... args) { |
||
274 | return R.readSourceLocation(std::forward<Args>(args)...); |
||
275 | } |
||
276 | }; |
||
277 | template <> |
||
278 | struct ReadDispatcher<Stmt*> { |
||
279 | template <class BasicReader, class... Args> |
||
280 | static Stmt* read(BasicReader &R, Args &&... args) { |
||
281 | return R.readStmtRef(std::forward<Args>(args)...); |
||
282 | } |
||
283 | }; |
||
284 | template <> |
||
285 | struct ReadDispatcher<TagDecl*> { |
||
286 | template <class BasicReader, class... Args> |
||
287 | static TagDecl* read(BasicReader &R, Args &&... args) { |
||
288 | return R.readTagDeclRef(std::forward<Args>(args)...); |
||
289 | } |
||
290 | }; |
||
291 | template <> |
||
292 | struct ReadDispatcher<TemplateArgument> { |
||
293 | template <class BasicReader, class... Args> |
||
294 | static TemplateArgument read(BasicReader &R, Args &&... args) { |
||
295 | return R.readTemplateArgument(std::forward<Args>(args)...); |
||
296 | } |
||
297 | }; |
||
298 | template <> |
||
299 | struct ReadDispatcher<TemplateArgument::ArgKind> { |
||
300 | template <class BasicReader, class... Args> |
||
301 | static TemplateArgument::ArgKind read(BasicReader &R, Args &&... args) { |
||
302 | return R.readTemplateArgumentKind(std::forward<Args>(args)...); |
||
303 | } |
||
304 | }; |
||
305 | template <> |
||
306 | struct ReadDispatcher<TemplateDecl*> { |
||
307 | template <class BasicReader, class... Args> |
||
308 | static TemplateDecl* read(BasicReader &R, Args &&... args) { |
||
309 | return R.readTemplateDeclRef(std::forward<Args>(args)...); |
||
310 | } |
||
311 | }; |
||
312 | template <> |
||
313 | struct ReadDispatcher<TemplateName> { |
||
314 | template <class BasicReader, class... Args> |
||
315 | static TemplateName read(BasicReader &R, Args &&... args) { |
||
316 | return R.readTemplateName(std::forward<Args>(args)...); |
||
317 | } |
||
318 | }; |
||
319 | template <> |
||
320 | struct ReadDispatcher<TemplateName::NameKind> { |
||
321 | template <class BasicReader, class... Args> |
||
322 | static TemplateName::NameKind read(BasicReader &R, Args &&... args) { |
||
323 | return R.readTemplateNameKind(std::forward<Args>(args)...); |
||
324 | } |
||
325 | }; |
||
326 | template <> |
||
327 | struct ReadDispatcher<TemplateTemplateParmDecl*> { |
||
328 | template <class BasicReader, class... Args> |
||
329 | static TemplateTemplateParmDecl* read(BasicReader &R, Args &&... args) { |
||
330 | return R.readTemplateTemplateParmDeclRef(std::forward<Args>(args)...); |
||
331 | } |
||
332 | }; |
||
333 | template <> |
||
334 | struct ReadDispatcher<TemplateTypeParmDecl*> { |
||
335 | template <class BasicReader, class... Args> |
||
336 | static TemplateTypeParmDecl* read(BasicReader &R, Args &&... args) { |
||
337 | return R.readTemplateTypeParmDeclRef(std::forward<Args>(args)...); |
||
338 | } |
||
339 | }; |
||
340 | template <> |
||
341 | struct ReadDispatcher<TypeOfKind> { |
||
342 | template <class BasicReader, class... Args> |
||
343 | static TypeOfKind read(BasicReader &R, Args &&... args) { |
||
344 | return R.readTypeOfKind(std::forward<Args>(args)...); |
||
345 | } |
||
346 | }; |
||
347 | template <> |
||
348 | struct ReadDispatcher<uint32_t> { |
||
349 | template <class BasicReader, class... Args> |
||
350 | static uint32_t read(BasicReader &R, Args &&... args) { |
||
351 | return R.readUInt32(std::forward<Args>(args)...); |
||
352 | } |
||
353 | }; |
||
354 | template <> |
||
355 | struct ReadDispatcher<uint64_t> { |
||
356 | template <class BasicReader, class... Args> |
||
357 | static uint64_t read(BasicReader &R, Args &&... args) { |
||
358 | return R.readUInt64(std::forward<Args>(args)...); |
||
359 | } |
||
360 | }; |
||
361 | template <> |
||
362 | struct ReadDispatcher<UnaryTransformType::UTTKind> { |
||
363 | template <class BasicReader, class... Args> |
||
364 | static UnaryTransformType::UTTKind read(BasicReader &R, Args &&... args) { |
||
365 | return R.readUnaryTypeTransformKind(std::forward<Args>(args)...); |
||
366 | } |
||
367 | }; |
||
368 | template <> |
||
369 | struct ReadDispatcher<UsingShadowDecl*> { |
||
370 | template <class BasicReader, class... Args> |
||
371 | static UsingShadowDecl* read(BasicReader &R, Args &&... args) { |
||
372 | return R.readUsingShadowDeclRef(std::forward<Args>(args)...); |
||
373 | } |
||
374 | }; |
||
375 | template <> |
||
376 | struct ReadDispatcher<ValueDecl*> { |
||
377 | template <class BasicReader, class... Args> |
||
378 | static ValueDecl* read(BasicReader &R, Args &&... args) { |
||
379 | return R.readValueDeclRef(std::forward<Args>(args)...); |
||
380 | } |
||
381 | }; |
||
382 | template <> |
||
383 | struct ReadDispatcher<VectorType::VectorKind> { |
||
384 | template <class BasicReader, class... Args> |
||
385 | static VectorType::VectorKind read(BasicReader &R, Args &&... args) { |
||
386 | return R.readVectorKind(std::forward<Args>(args)...); |
||
387 | } |
||
388 | }; |
||
389 | template <class T> |
||
390 | struct ReadDispatcher<llvm::ArrayRef<T>> { |
||
391 | template <class BasicReader, class... Args> |
||
392 | static llvm::ArrayRef<T> read(BasicReader &R, Args &&... args) { |
||
393 | return R.readArray(std::forward<Args>(args)...); |
||
394 | } |
||
395 | }; |
||
396 | template <class T> |
||
397 | struct ReadDispatcher<std::optional<T>> { |
||
398 | template <class BasicReader, class... Args> |
||
399 | static std::optional<T> read(BasicReader &R, Args &&... args) { |
||
400 | return R.readOptional(std::forward<Args>(args)...); |
||
401 | } |
||
402 | }; |
||
403 | |||
404 | template <class ValueType> |
||
405 | struct UnpackOptionalValue; |
||
406 | template <> |
||
407 | struct UnpackOptionalValue<CXXRecordDecl*> { |
||
408 | static std::optional<CXXRecordDecl*> unpack(CXXRecordDecl* value) { |
||
409 | return value ? std::optional<CXXRecordDecl*>(value) : std::nullopt; |
||
410 | } |
||
411 | }; |
||
412 | template <> |
||
413 | struct UnpackOptionalValue<ConceptDecl*> { |
||
414 | static std::optional<ConceptDecl*> unpack(ConceptDecl* value) { |
||
415 | return value ? std::optional<ConceptDecl*>(value) : std::nullopt; |
||
416 | } |
||
417 | }; |
||
418 | template <> |
||
419 | struct UnpackOptionalValue<Decl*> { |
||
420 | static std::optional<Decl*> unpack(Decl* value) { |
||
421 | return value ? std::optional<Decl*>(value) : std::nullopt; |
||
422 | } |
||
423 | }; |
||
424 | template <> |
||
425 | struct UnpackOptionalValue<Expr*> { |
||
426 | static std::optional<Expr*> unpack(Expr* value) { |
||
427 | return value ? std::optional<Expr*>(value) : std::nullopt; |
||
428 | } |
||
429 | }; |
||
430 | template <> |
||
431 | struct UnpackOptionalValue<FunctionDecl*> { |
||
432 | static std::optional<FunctionDecl*> unpack(FunctionDecl* value) { |
||
433 | return value ? std::optional<FunctionDecl*>(value) : std::nullopt; |
||
434 | } |
||
435 | }; |
||
436 | template <> |
||
437 | struct UnpackOptionalValue<IdentifierInfo*> { |
||
438 | static std::optional<IdentifierInfo*> unpack(IdentifierInfo* value) { |
||
439 | return value ? std::optional<IdentifierInfo*>(value) : std::nullopt; |
||
440 | } |
||
441 | }; |
||
442 | template <> |
||
443 | struct UnpackOptionalValue<NamedDecl*> { |
||
444 | static std::optional<NamedDecl*> unpack(NamedDecl* value) { |
||
445 | return value ? std::optional<NamedDecl*>(value) : std::nullopt; |
||
446 | } |
||
447 | }; |
||
448 | template <> |
||
449 | struct UnpackOptionalValue<NamespaceAliasDecl*> { |
||
450 | static std::optional<NamespaceAliasDecl*> unpack(NamespaceAliasDecl* value) { |
||
451 | return value ? std::optional<NamespaceAliasDecl*>(value) : std::nullopt; |
||
452 | } |
||
453 | }; |
||
454 | template <> |
||
455 | struct UnpackOptionalValue<NamespaceDecl*> { |
||
456 | static std::optional<NamespaceDecl*> unpack(NamespaceDecl* value) { |
||
457 | return value ? std::optional<NamespaceDecl*>(value) : std::nullopt; |
||
458 | } |
||
459 | }; |
||
460 | template <> |
||
461 | struct UnpackOptionalValue<ObjCProtocolDecl*> { |
||
462 | static std::optional<ObjCProtocolDecl*> unpack(ObjCProtocolDecl* value) { |
||
463 | return value ? std::optional<ObjCProtocolDecl*>(value) : std::nullopt; |
||
464 | } |
||
465 | }; |
||
466 | template <> |
||
467 | struct UnpackOptionalValue<ObjCTypeParamDecl*> { |
||
468 | static std::optional<ObjCTypeParamDecl*> unpack(ObjCTypeParamDecl* value) { |
||
469 | return value ? std::optional<ObjCTypeParamDecl*>(value) : std::nullopt; |
||
470 | } |
||
471 | }; |
||
472 | template <> |
||
473 | struct UnpackOptionalValue<QualType> { |
||
474 | static std::optional<QualType> unpack(QualType value) { |
||
475 | return value.isNull() ? std::nullopt : std::optional<QualType>(value); |
||
476 | } |
||
477 | }; |
||
478 | template <> |
||
479 | struct UnpackOptionalValue<Stmt*> { |
||
480 | static std::optional<Stmt*> unpack(Stmt* value) { |
||
481 | return value ? std::optional<Stmt*>(value) : std::nullopt; |
||
482 | } |
||
483 | }; |
||
484 | template <> |
||
485 | struct UnpackOptionalValue<TagDecl*> { |
||
486 | static std::optional<TagDecl*> unpack(TagDecl* value) { |
||
487 | return value ? std::optional<TagDecl*>(value) : std::nullopt; |
||
488 | } |
||
489 | }; |
||
490 | template <> |
||
491 | struct UnpackOptionalValue<TemplateDecl*> { |
||
492 | static std::optional<TemplateDecl*> unpack(TemplateDecl* value) { |
||
493 | return value ? std::optional<TemplateDecl*>(value) : std::nullopt; |
||
494 | } |
||
495 | }; |
||
496 | template <> |
||
497 | struct UnpackOptionalValue<TemplateName> { |
||
498 | static std::optional<TemplateName> unpack(TemplateName value) { |
||
499 | return value.isNull() ? std::nullopt : std::optional<TemplateName>(value); |
||
500 | } |
||
501 | }; |
||
502 | template <> |
||
503 | struct UnpackOptionalValue<TemplateTemplateParmDecl*> { |
||
504 | static std::optional<TemplateTemplateParmDecl*> unpack(TemplateTemplateParmDecl* value) { |
||
505 | return value ? std::optional<TemplateTemplateParmDecl*>(value) : std::nullopt; |
||
506 | } |
||
507 | }; |
||
508 | template <> |
||
509 | struct UnpackOptionalValue<TemplateTypeParmDecl*> { |
||
510 | static std::optional<TemplateTypeParmDecl*> unpack(TemplateTypeParmDecl* value) { |
||
511 | return value ? std::optional<TemplateTypeParmDecl*>(value) : std::nullopt; |
||
512 | } |
||
513 | }; |
||
514 | template <> |
||
515 | struct UnpackOptionalValue<uint32_t> { |
||
516 | static std::optional<uint32_t> unpack(uint32_t value) { |
||
517 | return value ? std::optional<uint32_t>(value - 1) : std::nullopt; |
||
518 | } |
||
519 | }; |
||
520 | template <> |
||
521 | struct UnpackOptionalValue<uint64_t> { |
||
522 | static std::optional<uint64_t> unpack(uint64_t value) { |
||
523 | return value ? std::optional<uint64_t>(value - 1) : std::nullopt; |
||
524 | } |
||
525 | }; |
||
526 | template <> |
||
527 | struct UnpackOptionalValue<UsingShadowDecl*> { |
||
528 | static std::optional<UsingShadowDecl*> unpack(UsingShadowDecl* value) { |
||
529 | return value ? std::optional<UsingShadowDecl*>(value) : std::nullopt; |
||
530 | } |
||
531 | }; |
||
532 | template <> |
||
533 | struct UnpackOptionalValue<ValueDecl*> { |
||
534 | static std::optional<ValueDecl*> unpack(ValueDecl* value) { |
||
535 | return value ? std::optional<ValueDecl*>(value) : std::nullopt; |
||
536 | } |
||
537 | }; |
||
538 | |||
539 | template <class Impl> |
||
540 | class BasicReaderBase { |
||
541 | ASTContext &C; |
||
542 | protected: |
||
543 | BasicReaderBase(ASTContext &ctx) : C(ctx) {} |
||
544 | public: |
||
545 | ASTContext &getASTContext() { return C; } |
||
546 | Impl &asImpl() { return static_cast<Impl&>(*this); } |
||
547 | APValue readAPValue() { |
||
548 | auto &ctx = asImpl().getASTContext(); |
||
549 | auto &&subR = asImpl().readObject(); |
||
550 | APValue::ValueKind kind = subR.find("kind").readAPValueKind(); |
||
551 | switch (kind) { |
||
552 | case APValue::None: { |
||
553 | return APValue(); |
||
554 | } |
||
555 | |||
556 | case APValue::FixedPoint: { |
||
557 | llvm::FixedPointSemantics semantics = subR.find("semantics").readFixedPointSemantics(); |
||
558 | llvm::APSInt value = subR.find("value").readAPSInt(); |
||
559 | |||
560 | return APValue(llvm::APFixedPoint(std::move(value), semantics)); |
||
561 | |||
562 | } |
||
563 | |||
564 | case APValue::ComplexInt: { |
||
565 | llvm::APSInt real = subR.find("real").readAPSInt(); |
||
566 | llvm::APSInt imag = subR.find("imag").readAPSInt(); |
||
567 | return APValue(real, imag); |
||
568 | } |
||
569 | |||
570 | case APValue::ComplexFloat: { |
||
571 | uint32_t semantics = subR.find("semantics").readUInt32(); |
||
572 | llvm::APInt real = subR.find("real").readAPInt(); |
||
573 | llvm::APInt imag = subR.find("imag").readAPInt(); |
||
574 | |||
575 | const llvm::fltSemantics &sema = llvm::APFloatBase::EnumToSemantics( |
||
576 | static_cast<llvm::APFloatBase::Semantics>(semantics)); |
||
577 | return APValue(llvm::APFloat(sema, real), |
||
578 | llvm::APFloat(sema, imag)); |
||
579 | |||
580 | } |
||
581 | |||
582 | case APValue::Vector: { |
||
583 | llvm::SmallVector<APValue, 8> elements_buffer_0; |
||
584 | llvm::ArrayRef<APValue> elements = subR.find("elements").template readArray<APValue>(elements_buffer_0); |
||
585 | |||
586 | APValue result; |
||
587 | result.MakeVector(); |
||
588 | unsigned length = elements.size(); |
||
589 | (void)result.setVectorUninit(length); |
||
590 | for (unsigned i = 0; i < length; i++) |
||
591 | result.getVectorElt(i) = elements[i]; |
||
592 | return result; |
||
593 | |||
594 | } |
||
595 | |||
596 | case APValue::Indeterminate: { |
||
597 | return APValue::IndeterminateValue(); |
||
598 | } |
||
599 | |||
600 | case APValue::Array: { |
||
601 | uint32_t totalLength = subR.find("totalLength").readUInt32(); |
||
602 | bool hasFiller = subR.find("hasFiller").readBool(); |
||
603 | llvm::SmallVector<APValue, 8> elements_buffer_0; |
||
604 | llvm::ArrayRef<APValue> elements = subR.find("elements").template readArray<APValue>(elements_buffer_0); |
||
605 | |||
606 | APValue result; |
||
607 | unsigned initLength = elements.size() - (hasFiller ? 1 : 0); |
||
608 | result.MakeArray(initLength, totalLength); |
||
609 | for (unsigned i = 0; i < initLength; ++i) |
||
610 | result.getArrayInitializedElt(i) = elements[i]; |
||
611 | if (hasFiller) |
||
612 | result.getArrayFiller() = elements.back(); |
||
613 | return result; |
||
614 | |||
615 | } |
||
616 | |||
617 | case APValue::Struct: { |
||
618 | llvm::SmallVector<APValue, 8> bases_buffer_0; |
||
619 | llvm::ArrayRef<APValue> bases = subR.find("bases").template readArray<APValue>(bases_buffer_0); |
||
620 | llvm::SmallVector<APValue, 8> fields_buffer_0; |
||
621 | llvm::ArrayRef<APValue> fields = subR.find("fields").template readArray<APValue>(fields_buffer_0); |
||
622 | |||
623 | APValue result; |
||
624 | result.MakeStruct(bases.size(), fields.size()); |
||
625 | for (unsigned i = 0; i < bases.size(); ++i) |
||
626 | result.getStructBase(i) = bases[i]; |
||
627 | for (unsigned i = 0; i < fields.size(); ++i) |
||
628 | result.getStructField(i) = fields[i]; |
||
629 | return result; |
||
630 | |||
631 | } |
||
632 | |||
633 | case APValue::Union: { |
||
634 | Decl* fieldDecl = subR.find("fieldDecl").readDeclRef(); |
||
635 | APValue value = subR.find("value").readAPValue(); |
||
636 | |||
637 | return APValue(cast<clang::FieldDecl>(fieldDecl), std::move(value)); |
||
638 | |||
639 | } |
||
640 | |||
641 | case APValue::AddrLabelDiff: { |
||
642 | Stmt* lhs = subR.find("lhs").readStmtRef(); |
||
643 | Stmt* rhs = subR.find("rhs").readStmtRef(); |
||
644 | |||
645 | return APValue(cast<AddrLabelExpr>(lhs), cast<AddrLabelExpr>(rhs)); |
||
646 | |||
647 | } |
||
648 | |||
649 | case APValue::Int: { |
||
650 | llvm::APSInt value = subR.find("value").readAPSInt(); |
||
651 | return APValue(value); |
||
652 | } |
||
653 | |||
654 | case APValue::MemberPointer: { |
||
655 | bool isDerived = subR.find("isDerived").readBool(); |
||
656 | ValueDecl* member = subR.find("member").readValueDeclRef(); |
||
657 | llvm::SmallVector<CXXRecordDecl*, 8> memberPath_buffer_0; |
||
658 | llvm::ArrayRef<CXXRecordDecl*> memberPath = subR.find("memberPath").template readArray<CXXRecordDecl*>(memberPath_buffer_0); |
||
659 | |||
660 | APValue result; |
||
661 | unsigned pathSize = memberPath.size(); |
||
662 | const CXXRecordDecl **pathArray = |
||
663 | result.setMemberPointerUninit(member, isDerived, pathSize).data(); |
||
664 | for (unsigned i = 0; i < pathSize; ++i) |
||
665 | pathArray[i] = memberPath[i]->getCanonicalDecl(); |
||
666 | return result; |
||
667 | |||
668 | } |
||
669 | |||
670 | case APValue::LValue: { |
||
671 | bool hasLValuePath = subR.find("hasLValuePath").readBool(); |
||
672 | bool isLValueOnePastTheEnd = subR.find("isLValueOnePastTheEnd").readBool(); |
||
673 | bool isExpr = subR.find("isExpr").readBool(); |
||
674 | bool isTypeInfo = subR.find("isTypeInfo").readBool(); |
||
675 | bool hasBase = subR.find("hasBase").readBool(); |
||
676 | bool isNullPtr = subR.find("isNullPtr").readBool(); |
||
677 | std::optional<QualType> typeInfo; |
||
678 | if ( hasBase && isTypeInfo ) { |
||
679 | typeInfo.emplace(subR.find("typeInfo").readQualType()); |
||
680 | } |
||
681 | std::optional<QualType> type; |
||
682 | if ( hasBase && isTypeInfo ) { |
||
683 | type.emplace(subR.find("type").readQualType()); |
||
684 | } |
||
685 | std::optional<uint32_t> callIndex; |
||
686 | if ( hasBase && !isTypeInfo ) { |
||
687 | callIndex.emplace(subR.find("callIndex").readUInt32()); |
||
688 | } |
||
689 | std::optional<uint32_t> version; |
||
690 | if ( hasBase && !isTypeInfo ) { |
||
691 | version.emplace(subR.find("version").readUInt32()); |
||
692 | } |
||
693 | std::optional<Stmt*> stmt; |
||
694 | if ( hasBase && !isTypeInfo && isExpr ) { |
||
695 | stmt.emplace(subR.find("stmt").readStmtRef()); |
||
696 | } |
||
697 | std::optional<Decl*> decl; |
||
698 | if ( hasBase && !isTypeInfo && !isExpr ) { |
||
699 | decl.emplace(subR.find("decl").readDeclRef()); |
||
700 | } |
||
701 | uint32_t offsetQuantity = subR.find("offsetQuantity").readUInt32(); |
||
702 | llvm::SmallVector<APValue::LValuePathEntry, 8> lvaluePath_buffer_0; |
||
703 | std::optional<APValue::LValuePathSerializationHelper> lvaluePath; |
||
704 | if ( hasLValuePath ) { |
||
705 | lvaluePath.emplace(subR.find("lvaluePath").readLValuePathSerializationHelper(lvaluePath_buffer_0)); |
||
706 | } |
||
707 | |||
708 | (void)ctx; |
||
709 | APValue::LValueBase base; |
||
710 | if (hasBase) { |
||
711 | if (isTypeInfo) { |
||
712 | base = APValue::LValueBase::getTypeInfo( |
||
713 | TypeInfoLValue(typeInfo->getTypePtr()), *type); |
||
714 | } else if (isExpr) { |
||
715 | base = APValue::LValueBase(cast<Expr>(*stmt), |
||
716 | *callIndex, *version); |
||
717 | } else { |
||
718 | base = APValue::LValueBase(cast<ValueDecl>(*decl), |
||
719 | *callIndex, *version); |
||
720 | } |
||
721 | } |
||
722 | CharUnits offset = CharUnits::fromQuantity(offsetQuantity); |
||
723 | APValue result; |
||
724 | result.MakeLValue(); |
||
725 | if (!hasLValuePath) { |
||
726 | result.setLValue(base, offset, APValue::NoLValuePath{}, isNullPtr); |
||
727 | return result; |
||
728 | } |
||
729 | auto pathLength = lvaluePath->Path.size(); |
||
730 | APValue::LValuePathEntry *path = result.setLValueUninit( |
||
731 | base, offset, pathLength, isLValueOnePastTheEnd, isNullPtr).data(); |
||
732 | llvm::copy(lvaluePath->Path, path); |
||
733 | return result; |
||
734 | |||
735 | } |
||
736 | |||
737 | case APValue::Float: { |
||
738 | llvm::APInt value = subR.find("value").readAPInt(); |
||
739 | uint32_t semantics = subR.find("semantics").readUInt32(); |
||
740 | |||
741 | const llvm::fltSemantics &floatSema = llvm::APFloatBase::EnumToSemantics( |
||
742 | static_cast<llvm::APFloatBase::Semantics>(semantics)); |
||
743 | return APValue(llvm::APFloat(floatSema, value)); |
||
744 | |||
745 | } |
||
746 | |||
747 | } |
||
748 | llvm_unreachable("bad APValue::ValueKind"); |
||
749 | } |
||
750 | APValue::ValueKind readAPValueKind() { |
||
751 | return asImpl().template readEnum<APValue::ValueKind>(); |
||
752 | } |
||
753 | ArrayType::ArraySizeModifier readArraySizeModifier() { |
||
754 | return asImpl().template readEnum<ArrayType::ArraySizeModifier>(); |
||
755 | } |
||
756 | attr::Kind readAttrKind() { |
||
757 | return asImpl().template readEnum<attr::Kind>(); |
||
758 | } |
||
759 | AutoTypeKeyword readAutoTypeKeyword() { |
||
760 | return asImpl().template readEnum<AutoTypeKeyword>(); |
||
761 | } |
||
762 | BuiltinType::Kind readBuiltinTypeKind() { |
||
763 | return asImpl().template readEnum<BuiltinType::Kind>(); |
||
764 | } |
||
765 | CXXRecordDecl* readCXXRecordDeclRef() { |
||
766 | return cast_or_null<CXXRecordDecl>(asImpl().readDeclRef()); |
||
767 | } |
||
768 | CallingConv readCallingConv() { |
||
769 | return asImpl().template readEnum<CallingConv>(); |
||
770 | } |
||
771 | ConceptDecl* readConceptDeclRef() { |
||
772 | return cast_or_null<ConceptDecl>(asImpl().readDeclRef()); |
||
773 | } |
||
774 | DeclarationName readDeclarationName() { |
||
775 | auto &ctx = asImpl().getASTContext(); |
||
776 | auto &&subR = asImpl().readObject(); |
||
777 | DeclarationName::NameKind kind = subR.find("kind").readDeclarationNameKind(); |
||
778 | switch (kind) { |
||
779 | case DeclarationName::CXXLiteralOperatorName: { |
||
780 | IdentifierInfo* identifier = subR.find("identifier").readIdentifier(); |
||
781 | |||
782 | return ctx.DeclarationNames.getCXXLiteralOperatorName(identifier); |
||
783 | |||
784 | } |
||
785 | |||
786 | case DeclarationName::CXXUsingDirective: { |
||
787 | |||
788 | return DeclarationName::getUsingDirectiveName(); |
||
789 | |||
790 | } |
||
791 | |||
792 | case DeclarationName::Identifier: { |
||
793 | IdentifierInfo* identifier = subR.find("identifier").readIdentifier(); |
||
794 | |||
795 | return DeclarationName(identifier); |
||
796 | |||
797 | } |
||
798 | |||
799 | case DeclarationName::ObjCZeroArgSelector: { |
||
800 | Selector selector = subR.find("selector").readSelector(); |
||
801 | |||
802 | return DeclarationName(selector); |
||
803 | |||
804 | } |
||
805 | |||
806 | case DeclarationName::ObjCOneArgSelector: { |
||
807 | Selector selector = subR.find("selector").readSelector(); |
||
808 | |||
809 | return DeclarationName(selector); |
||
810 | |||
811 | } |
||
812 | |||
813 | case DeclarationName::ObjCMultiArgSelector: { |
||
814 | Selector selector = subR.find("selector").readSelector(); |
||
815 | |||
816 | return DeclarationName(selector); |
||
817 | |||
818 | } |
||
819 | |||
820 | case DeclarationName::CXXConstructorName: { |
||
821 | QualType type = subR.find("type").readQualType(); |
||
822 | |||
823 | return ctx.DeclarationNames.getCXXConstructorName( |
||
824 | ctx.getCanonicalType(type)); |
||
825 | |||
826 | } |
||
827 | |||
828 | case DeclarationName::CXXDestructorName: { |
||
829 | QualType type = subR.find("type").readQualType(); |
||
830 | |||
831 | return ctx.DeclarationNames.getCXXDestructorName( |
||
832 | ctx.getCanonicalType(type)); |
||
833 | |||
834 | } |
||
835 | |||
836 | case DeclarationName::CXXConversionFunctionName: { |
||
837 | QualType type = subR.find("type").readQualType(); |
||
838 | |||
839 | return ctx.DeclarationNames.getCXXConversionFunctionName( |
||
840 | ctx.getCanonicalType(type)); |
||
841 | |||
842 | } |
||
843 | |||
844 | case DeclarationName::CXXDeductionGuideName: { |
||
845 | TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef(); |
||
846 | |||
847 | return ctx.DeclarationNames.getCXXDeductionGuideName(declaration); |
||
848 | |||
849 | } |
||
850 | |||
851 | case DeclarationName::CXXOperatorName: { |
||
852 | OverloadedOperatorKind operatorKind = subR.find("operatorKind").readOverloadedOperatorKind(); |
||
853 | |||
854 | return ctx.DeclarationNames.getCXXOperatorName(operatorKind); |
||
855 | |||
856 | } |
||
857 | |||
858 | } |
||
859 | llvm_unreachable("bad DeclarationName::NameKind"); |
||
860 | } |
||
861 | DeclarationName::NameKind readDeclarationNameKind() { |
||
862 | return asImpl().template readEnum<DeclarationName::NameKind>(); |
||
863 | } |
||
864 | ElaboratedTypeKeyword readElaboratedTypeKeyword() { |
||
865 | return asImpl().template readEnum<ElaboratedTypeKeyword>(); |
||
866 | } |
||
867 | Expr* readExprRef() { |
||
868 | return cast_or_null<Expr>(asImpl().readStmtRef()); |
||
869 | } |
||
870 | FunctionDecl* readFunctionDeclRef() { |
||
871 | return cast_or_null<FunctionDecl>(asImpl().readDeclRef()); |
||
872 | } |
||
873 | NamedDecl* readNamedDeclRef() { |
||
874 | return cast_or_null<NamedDecl>(asImpl().readDeclRef()); |
||
875 | } |
||
876 | NamespaceAliasDecl* readNamespaceAliasDeclRef() { |
||
877 | return cast_or_null<NamespaceAliasDecl>(asImpl().readDeclRef()); |
||
878 | } |
||
879 | NamespaceDecl* readNamespaceDeclRef() { |
||
880 | return cast_or_null<NamespaceDecl>(asImpl().readDeclRef()); |
||
881 | } |
||
882 | NestedNameSpecifier::SpecifierKind readNestedNameSpecifierKind() { |
||
883 | return asImpl().template readEnum<NestedNameSpecifier::SpecifierKind>(); |
||
884 | } |
||
885 | ObjCProtocolDecl* readObjCProtocolDeclRef() { |
||
886 | return cast_or_null<ObjCProtocolDecl>(asImpl().readDeclRef()); |
||
887 | } |
||
888 | ObjCTypeParamDecl* readObjCTypeParamDeclRef() { |
||
889 | return cast_or_null<ObjCTypeParamDecl>(asImpl().readDeclRef()); |
||
890 | } |
||
891 | OverloadedOperatorKind readOverloadedOperatorKind() { |
||
892 | return asImpl().template readEnum<OverloadedOperatorKind>(); |
||
893 | } |
||
894 | RefQualifierKind readRefQualifierKind() { |
||
895 | return asImpl().template readEnum<RefQualifierKind>(); |
||
896 | } |
||
897 | TagDecl* readTagDeclRef() { |
||
898 | return cast_or_null<TagDecl>(asImpl().readDeclRef()); |
||
899 | } |
||
900 | TemplateArgument readTemplateArgument() { |
||
901 | auto &ctx = asImpl().getASTContext(); |
||
902 | auto &&subR = asImpl().readObject(); |
||
903 | TemplateArgument::ArgKind kind = subR.find("kind").readTemplateArgumentKind(); |
||
904 | switch (kind) { |
||
905 | case TemplateArgument::Null: { |
||
906 | |||
907 | return TemplateArgument(); |
||
908 | |||
909 | } |
||
910 | |||
911 | case TemplateArgument::Type: { |
||
912 | QualType type = subR.find("type").readQualType(); |
||
913 | |||
914 | return TemplateArgument(type); |
||
915 | |||
916 | } |
||
917 | |||
918 | case TemplateArgument::Declaration: { |
||
919 | ValueDecl* declaration = subR.find("declaration").readValueDeclRef(); |
||
920 | QualType parameterType = subR.find("parameterType").readQualType(); |
||
921 | |||
922 | return TemplateArgument(declaration, parameterType); |
||
923 | |||
924 | } |
||
925 | |||
926 | case TemplateArgument::NullPtr: { |
||
927 | QualType type = subR.find("type").readQualType(); |
||
928 | |||
929 | return TemplateArgument(type, /*nullptr*/ true); |
||
930 | |||
931 | } |
||
932 | |||
933 | case TemplateArgument::Integral: { |
||
934 | llvm::APSInt value = subR.find("value").readAPSInt(); |
||
935 | QualType type = subR.find("type").readQualType(); |
||
936 | |||
937 | return TemplateArgument(ctx, value, type); |
||
938 | |||
939 | } |
||
940 | |||
941 | case TemplateArgument::Template: { |
||
942 | TemplateName name = subR.find("name").readTemplateName(); |
||
943 | |||
944 | return TemplateArgument(name); |
||
945 | |||
946 | } |
||
947 | |||
948 | case TemplateArgument::TemplateExpansion: { |
||
949 | TemplateName name = subR.find("name").readTemplateName(); |
||
950 | std::optional<uint32_t> numExpansions = subR.find("numExpansions").template readOptional<uint32_t>(); |
||
951 | |||
952 | auto numExpansionsUnsigned = llvm::transformOptional( |
||
953 | numExpansions, [](uint32_t i) { return unsigned(i); }); |
||
954 | |||
955 | return TemplateArgument(name, numExpansionsUnsigned); |
||
956 | |||
957 | } |
||
958 | |||
959 | case TemplateArgument::Expression: { |
||
960 | Expr* expression = subR.find("expression").readExprRef(); |
||
961 | |||
962 | return TemplateArgument(expression); |
||
963 | |||
964 | } |
||
965 | |||
966 | case TemplateArgument::Pack: { |
||
967 | llvm::SmallVector<TemplateArgument, 8> elements_buffer_0; |
||
968 | llvm::ArrayRef<TemplateArgument> elements = subR.find("elements").template readArray<TemplateArgument>(elements_buffer_0); |
||
969 | |||
970 | // Copy the pack into the ASTContext. |
||
971 | TemplateArgument *ctxElements = new (ctx) TemplateArgument[elements.size()]; |
||
972 | for (size_t i = 0, e = elements.size(); i != e; ++i) |
||
973 | ctxElements[i] = elements[i]; |
||
974 | return TemplateArgument(llvm::ArrayRef(ctxElements, elements.size())); |
||
975 | |||
976 | } |
||
977 | |||
978 | } |
||
979 | llvm_unreachable("bad TemplateArgument::ArgKind"); |
||
980 | } |
||
981 | TemplateArgument::ArgKind readTemplateArgumentKind() { |
||
982 | return asImpl().template readEnum<TemplateArgument::ArgKind>(); |
||
983 | } |
||
984 | TemplateDecl* readTemplateDeclRef() { |
||
985 | return cast_or_null<TemplateDecl>(asImpl().readDeclRef()); |
||
986 | } |
||
987 | TemplateName readTemplateName() { |
||
988 | auto &ctx = asImpl().getASTContext(); |
||
989 | auto &&subR = asImpl().readObject(); |
||
990 | TemplateName::NameKind kind = subR.find("kind").readTemplateNameKind(); |
||
991 | switch (kind) { |
||
992 | case TemplateName::Template: { |
||
993 | TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef(); |
||
994 | |||
995 | return TemplateName(declaration); |
||
996 | |||
997 | } |
||
998 | |||
999 | case TemplateName::UsingTemplate: { |
||
1000 | UsingShadowDecl* foundDecl = subR.find("foundDecl").readUsingShadowDeclRef(); |
||
1001 | |||
1002 | return TemplateName(foundDecl); |
||
1003 | |||
1004 | } |
||
1005 | |||
1006 | case TemplateName::OverloadedTemplate: { |
||
1007 | llvm::SmallVector<NamedDecl*, 8> overloads_buffer_0; |
||
1008 | llvm::ArrayRef<NamedDecl*> overloads = subR.find("overloads").template readArray<NamedDecl*>(overloads_buffer_0); |
||
1009 | |||
1010 | // Copy into an UnresolvedSet to satisfy the interface. |
||
1011 | UnresolvedSet<8> overloadSet; |
||
1012 | for (auto overload : overloads) { |
||
1013 | overloadSet.addDecl(overload); |
||
1014 | } |
||
1015 | |||
1016 | return ctx.getOverloadedTemplateName(overloadSet.begin(), |
||
1017 | overloadSet.end()); |
||
1018 | |||
1019 | } |
||
1020 | |||
1021 | case TemplateName::AssumedTemplate: { |
||
1022 | DeclarationName name = subR.find("name").readDeclarationName(); |
||
1023 | |||
1024 | return ctx.getAssumedTemplateName(name); |
||
1025 | |||
1026 | } |
||
1027 | |||
1028 | case TemplateName::QualifiedTemplate: { |
||
1029 | NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier(); |
||
1030 | bool hasTemplateKeyword = subR.find("hasTemplateKeyword").readBool(); |
||
1031 | TemplateName underlyingTemplateName = subR.find("underlyingTemplateName").readTemplateName(); |
||
1032 | |||
1033 | return ctx.getQualifiedTemplateName(qualifier, hasTemplateKeyword, |
||
1034 | underlyingTemplateName); |
||
1035 | |||
1036 | } |
||
1037 | |||
1038 | case TemplateName::DependentTemplate: { |
||
1039 | NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier(); |
||
1040 | std::optional<IdentifierInfo*> identifier = subR.find("identifier").template readOptional<IdentifierInfo*>(); |
||
1041 | std::optional<OverloadedOperatorKind> operatorKind; |
||
1042 | if ( !identifier ) { |
||
1043 | operatorKind.emplace(subR.find("operatorKind").readOverloadedOperatorKind()); |
||
1044 | } |
||
1045 | |||
1046 | if (identifier) { |
||
1047 | return ctx.getDependentTemplateName(qualifier, *identifier); |
||
1048 | } else { |
||
1049 | return ctx.getDependentTemplateName(qualifier, *operatorKind); |
||
1050 | } |
||
1051 | |||
1052 | } |
||
1053 | |||
1054 | case TemplateName::SubstTemplateTemplateParm: { |
||
1055 | TemplateName replacement = subR.find("replacement").readTemplateName(); |
||
1056 | Decl* associatedDecl = subR.find("associatedDecl").readDeclRef(); |
||
1057 | uint32_t index = subR.find("index").readUInt32(); |
||
1058 | std::optional<uint32_t> packIndex = subR.find("packIndex").template readOptional<uint32_t>(); |
||
1059 | |||
1060 | return ctx.getSubstTemplateTemplateParm(replacement, associatedDecl, index, packIndex); |
||
1061 | |||
1062 | } |
||
1063 | |||
1064 | case TemplateName::SubstTemplateTemplateParmPack: { |
||
1065 | TemplateArgument argumentPack = subR.find("argumentPack").readTemplateArgument(); |
||
1066 | Decl* associatedDecl = subR.find("associatedDecl").readDeclRef(); |
||
1067 | uint32_t index = subR.find("index").readUInt32(); |
||
1068 | bool final = subR.find("final").readBool(); |
||
1069 | |||
1070 | return ctx.getSubstTemplateTemplateParmPack(argumentPack, associatedDecl, index, final); |
||
1071 | |||
1072 | } |
||
1073 | |||
1074 | } |
||
1075 | llvm_unreachable("bad TemplateName::NameKind"); |
||
1076 | } |
||
1077 | TemplateName::NameKind readTemplateNameKind() { |
||
1078 | return asImpl().template readEnum<TemplateName::NameKind>(); |
||
1079 | } |
||
1080 | TemplateTemplateParmDecl* readTemplateTemplateParmDeclRef() { |
||
1081 | return cast_or_null<TemplateTemplateParmDecl>(asImpl().readDeclRef()); |
||
1082 | } |
||
1083 | TemplateTypeParmDecl* readTemplateTypeParmDeclRef() { |
||
1084 | return cast_or_null<TemplateTypeParmDecl>(asImpl().readDeclRef()); |
||
1085 | } |
||
1086 | TypeOfKind readTypeOfKind() { |
||
1087 | return asImpl().template readEnum<TypeOfKind>(); |
||
1088 | } |
||
1089 | UnaryTransformType::UTTKind readUnaryTypeTransformKind() { |
||
1090 | return asImpl().template readEnum<UnaryTransformType::UTTKind>(); |
||
1091 | } |
||
1092 | UsingShadowDecl* readUsingShadowDeclRef() { |
||
1093 | return cast_or_null<UsingShadowDecl>(asImpl().readDeclRef()); |
||
1094 | } |
||
1095 | ValueDecl* readValueDeclRef() { |
||
1096 | return cast_or_null<ValueDecl>(asImpl().readDeclRef()); |
||
1097 | } |
||
1098 | VectorType::VectorKind readVectorKind() { |
||
1099 | return asImpl().template readEnum<VectorType::VectorKind>(); |
||
1100 | } |
||
1101 | }; |
||
1102 |