10void JSONNodeDumper::addPreviousDeclaration(
const Decl *D) {
12#define DECL(DERIVED, BASE) \
14 return writePreviousDeclImpl(cast<DERIVED##Decl>(D));
15#define ABSTRACT_DECL(DECL)
16#include "clang/AST/DeclNodes.inc"
20 llvm_unreachable(
"Decl that isn't part of DeclNodes.inc!");
24 const char *AttrName =
nullptr;
28 AttrName = #X"Attr"; \
30#include "clang/Basic/AttrList.inc"
33 JOS.attribute(
"id", createPointerRepresentation(A));
34 JOS.attribute(
"kind", AttrName);
35 JOS.attributeObject(
"range", [A,
this] { writeSourceRange(A->
getRange()); });
37 attributeOnlyIfTrue(
"implicit", A->
isImplicit());
52 JOS.attribute(
"id", createPointerRepresentation(S));
53 JOS.attribute(
"kind", S->getStmtClassName());
54 JOS.attributeObject(
"range",
55 [S,
this] { writeSourceRange(S->getSourceRange()); });
57 if (
const auto *E = dyn_cast<Expr>(S)) {
58 JOS.attribute(
"type", createQualType(E->getType()));
60 switch (E->getValueKind()) {
73 JOS.attribute(
"id", createPointerRepresentation(T));
79 JOS.attribute(
"type", createQualType(
QualType(T, 0),
false));
82 attributeOnlyIfTrue(
"isInstantiationDependent",
85 attributeOnlyIfTrue(
"containsUnexpandedPack",
87 attributeOnlyIfTrue(
"isImported", T->
isFromAST());
93 JOS.attribute(
"kind",
"QualType");
94 JOS.attribute(
"type", createQualType(T));
99 JOS.attribute(
"id", createPointerRepresentation(D));
105 JOS.attributeObject(
"loc",
106 [D,
this] { writeSourceLocation(D->
getLocation()); });
107 JOS.attributeObject(
"range",
109 attributeOnlyIfTrue(
"isImplicit", D->
isImplicit());
113 JOS.attribute(
"isUsed",
true);
115 JOS.attribute(
"isReferenced",
true);
117 if (
const auto *ND = dyn_cast<NamedDecl>(D))
118 attributeOnlyIfTrue(
"isHidden", !ND->isUnconditionallyVisible());
124 const auto *ParentDeclContextDecl = dyn_cast<Decl>(D->
getDeclContext());
125 JOS.attribute(
"parentDeclContextId",
126 createPointerRepresentation(ParentDeclContextDecl));
129 addPreviousDeclaration(D);
138 JOS.attribute(
"id", createPointerRepresentation(
C));
139 JOS.attribute(
"kind",
C->getCommentKindName());
140 JOS.attributeObject(
"loc",
141 [
C,
this] { writeSourceLocation(
C->getLocation()); });
142 JOS.attributeObject(
"range",
143 [
C,
this] { writeSourceRange(
C->getSourceRange()); });
150 JOS.attribute(
"kind",
"TemplateArgument");
152 JOS.attributeObject(
"range", [R,
this] { writeSourceRange(R); });
155 JOS.attribute(
Label.empty() ?
"fromDecl" :
Label, createBareDeclRef(From));
161 JOS.attribute(
"kind",
"CXXCtorInitializer");
162 if (Init->isAnyMemberInitializer())
163 JOS.attribute(
"anyInit", createBareDeclRef(Init->getAnyMember()));
164 else if (Init->isBaseInitializer())
165 JOS.attribute(
"baseInit",
166 createQualType(
QualType(Init->getBaseClass(), 0)));
167 else if (Init->isDelegatingInitializer())
168 JOS.attribute(
"delegatingInit",
169 createQualType(Init->getTypeSourceInfo()->getType()));
171 llvm_unreachable(
"Unknown initializer type");
177 JOS.attribute(
"kind",
"Capture");
178 attributeOnlyIfTrue(
"byref",
C.isByRef());
179 attributeOnlyIfTrue(
"nested",
C.isNested());
181 JOS.attribute(
"var", createBareDeclRef(
C.getVariable()));
185 JOS.attribute(
"associationKind", A.getTypeSourceInfo() ?
"case" :
"default");
186 attributeOnlyIfTrue(
"selected", A.isSelected());
195 JOS.attribute(
"kind",
"TypeRequirement");
198 JOS.attribute(
"kind",
"SimpleRequirement");
201 JOS.attribute(
"kind",
"CompoundRequirement");
204 JOS.attribute(
"kind",
"NestedRequirement");
208 if (
auto *ER = dyn_cast<concepts::ExprRequirement>(R))
209 attributeOnlyIfTrue(
"noexcept", ER->hasNoexceptRequirement());
211 attributeOnlyIfTrue(
"isDependent", R->
isDependent());
214 attributeOnlyIfTrue(
"containsUnexpandedPack",
220 llvm::raw_string_ostream OS(Str);
221 Value.printPretty(OS, Ctx, Ty);
222 JOS.attribute(
"value", OS.str());
225void JSONNodeDumper::writeIncludeStack(
PresumedLoc Loc,
bool JustFirst) {
229 JOS.attributeBegin(
"includedFrom");
251 if (LastLocFilename != ActualFile) {
252 JOS.attribute(
"file", ActualFile);
253 JOS.attribute(
"line", ActualLine);
254 }
else if (LastLocLine != ActualLine)
255 JOS.attribute(
"line", ActualLine);
258 if (PresumedFile != ActualFile && LastLocPresumedFilename != PresumedFile)
259 JOS.attribute(
"presumedFile", PresumedFile);
261 unsigned PresumedLine = Presumed.
getLine();
262 if (ActualLine != PresumedLine && LastLocPresumedLine != PresumedLine)
263 JOS.attribute(
"presumedLine", PresumedLine);
266 JOS.attribute(
"tokLen",
268 LastLocFilename = ActualFile;
269 LastLocPresumedFilename = PresumedFile;
270 LastLocPresumedLine = PresumedLine;
271 LastLocLine = ActualLine;
285 if (Expansion != Spelling) {
288 JOS.attributeObject(
"spellingLoc", [Spelling,
this] {
289 writeBareSourceLocation(Spelling,
true);
291 JOS.attributeObject(
"expansionLoc", [Expansion, Loc,
this] {
292 writeBareSourceLocation(Expansion,
false);
296 JOS.attribute(
"isMacroArgExpansion",
true);
299 writeBareSourceLocation(Spelling,
true);
302void JSONNodeDumper::writeSourceRange(
SourceRange R) {
303 JOS.attributeObject(
"begin",
304 [R,
this] { writeSourceLocation(R.
getBegin()); });
305 JOS.attributeObject(
"end", [R,
this] { writeSourceLocation(R.
getEnd()); });
308std::string JSONNodeDumper::createPointerRepresentation(
const void *Ptr) {
312 return "0x" + llvm::utohexstr(
reinterpret_cast<uint64_t>(Ptr),
true);
315llvm::json::Object JSONNodeDumper::createQualType(
QualType QT,
bool Desugar) {
319 if (Desugar && !QT.
isNull()) {
324 Ret[
"typeAliasDeclId"] = createPointerRepresentation(TT->getDecl());
329void JSONNodeDumper::writeBareDeclRef(
const Decl *D) {
330 JOS.attribute(
"id", createPointerRepresentation(D));
335 if (
const auto *ND = dyn_cast<NamedDecl>(D))
336 JOS.attribute(
"name", ND->getDeclName().getAsString());
337 if (
const auto *VD = dyn_cast<ValueDecl>(D))
338 JOS.attribute(
"type", createQualType(VD->getType()));
341llvm::json::Object JSONNodeDumper::createBareDeclRef(
const Decl *D) {
342 llvm::json::Object
Ret{{
"id", createPointerRepresentation(D)}};
347 if (
const auto *ND = dyn_cast<NamedDecl>(D))
348 Ret[
"name"] = ND->getDeclName().getAsString();
349 if (
const auto *VD = dyn_cast<ValueDecl>(D))
350 Ret[
"type"] = createQualType(VD->getType());
354llvm::json::Array JSONNodeDumper::createCastPath(
const CastExpr *
C) {
355 llvm::json::Array
Ret;
359 for (
auto I =
C->path_begin(), E =
C->path_end(); I != E; ++I) {
364 llvm::json::Object Val{{
"name", RD->getName()}};
365 if (
Base->isVirtual())
366 Val[
"isVirtual"] =
true;
367 Ret.push_back(std::move(Val));
372#define FIELD2(Name, Flag) if (RD->Flag()) Ret[Name] = true
373#define FIELD1(Flag) FIELD2(#Flag, Flag)
375static llvm::json::Object
377 llvm::json::Object Ret;
379 FIELD2(
"exists", hasDefaultConstructor);
380 FIELD2(
"trivial", hasTrivialDefaultConstructor);
381 FIELD2(
"nonTrivial", hasNonTrivialDefaultConstructor);
382 FIELD2(
"userProvided", hasUserProvidedDefaultConstructor);
383 FIELD2(
"isConstexpr", hasConstexprDefaultConstructor);
384 FIELD2(
"needsImplicit", needsImplicitDefaultConstructor);
385 FIELD2(
"defaultedIsConstexpr", defaultedDefaultConstructorIsConstexpr);
390static llvm::json::Object
392 llvm::json::Object Ret;
394 FIELD2(
"simple", hasSimpleCopyConstructor);
395 FIELD2(
"trivial", hasTrivialCopyConstructor);
396 FIELD2(
"nonTrivial", hasNonTrivialCopyConstructor);
397 FIELD2(
"userDeclared", hasUserDeclaredCopyConstructor);
398 FIELD2(
"hasConstParam", hasCopyConstructorWithConstParam);
399 FIELD2(
"implicitHasConstParam", implicitCopyConstructorHasConstParam);
400 FIELD2(
"needsImplicit", needsImplicitCopyConstructor);
401 FIELD2(
"needsOverloadResolution", needsOverloadResolutionForCopyConstructor);
403 FIELD2(
"defaultedIsDeleted", defaultedCopyConstructorIsDeleted);
408static llvm::json::Object
410 llvm::json::Object Ret;
412 FIELD2(
"exists", hasMoveConstructor);
413 FIELD2(
"simple", hasSimpleMoveConstructor);
414 FIELD2(
"trivial", hasTrivialMoveConstructor);
415 FIELD2(
"nonTrivial", hasNonTrivialMoveConstructor);
416 FIELD2(
"userDeclared", hasUserDeclaredMoveConstructor);
417 FIELD2(
"needsImplicit", needsImplicitMoveConstructor);
418 FIELD2(
"needsOverloadResolution", needsOverloadResolutionForMoveConstructor);
420 FIELD2(
"defaultedIsDeleted", defaultedMoveConstructorIsDeleted);
425static llvm::json::Object
427 llvm::json::Object Ret;
429 FIELD2(
"simple", hasSimpleCopyAssignment);
430 FIELD2(
"trivial", hasTrivialCopyAssignment);
431 FIELD2(
"nonTrivial", hasNonTrivialCopyAssignment);
432 FIELD2(
"hasConstParam", hasCopyAssignmentWithConstParam);
433 FIELD2(
"implicitHasConstParam", implicitCopyAssignmentHasConstParam);
434 FIELD2(
"userDeclared", hasUserDeclaredCopyAssignment);
435 FIELD2(
"needsImplicit", needsImplicitCopyAssignment);
436 FIELD2(
"needsOverloadResolution", needsOverloadResolutionForCopyAssignment);
441static llvm::json::Object
443 llvm::json::Object Ret;
445 FIELD2(
"exists", hasMoveAssignment);
446 FIELD2(
"simple", hasSimpleMoveAssignment);
447 FIELD2(
"trivial", hasTrivialMoveAssignment);
448 FIELD2(
"nonTrivial", hasNonTrivialMoveAssignment);
449 FIELD2(
"userDeclared", hasUserDeclaredMoveAssignment);
450 FIELD2(
"needsImplicit", needsImplicitMoveAssignment);
451 FIELD2(
"needsOverloadResolution", needsOverloadResolutionForMoveAssignment);
456static llvm::json::Object
458 llvm::json::Object Ret;
460 FIELD2(
"simple", hasSimpleDestructor);
461 FIELD2(
"irrelevant", hasIrrelevantDestructor);
462 FIELD2(
"trivial", hasTrivialDestructor);
463 FIELD2(
"nonTrivial", hasNonTrivialDestructor);
464 FIELD2(
"userDeclared", hasUserDeclaredDestructor);
465 FIELD2(
"needsImplicit", needsImplicitDestructor);
466 FIELD2(
"needsOverloadResolution", needsOverloadResolutionForDestructor);
468 FIELD2(
"defaultedIsDeleted", defaultedDestructorIsDeleted);
474JSONNodeDumper::createCXXRecordDefinitionData(
const CXXRecordDecl *RD) {
475 llvm::json::Object
Ret;
483 FIELD1(isTriviallyCopyable);
490 FIELD1(hasUserDeclaredConstructor);
491 FIELD1(hasConstexprNonCopyMoveConstructor);
493 FIELD1(hasVariantMembers);
494 FIELD2(
"canConstDefaultInit", allowConstDefaultInit);
511 if (AccessSpelling.empty())
513 return AccessSpelling.str();
518 llvm::json::Object
Ret;
522 Ret[
"writtenAccess"] =
525 Ret[
"isVirtual"] =
true;
527 Ret[
"isPackExpansion"] =
true;
533 JOS.attribute(
"decl", createBareDeclRef(TT->
getDecl()));
535 JOS.attribute(
"type", createQualType(TT->
desugar()));
541 JOS.attribute(
"type", createQualType(TT->
desugar()));
556 attributeOnlyIfTrue(
"const", T->
isConst());
557 attributeOnlyIfTrue(
"volatile", T->
isVolatile());
558 attributeOnlyIfTrue(
"restrict", T->
isRestrict());
559 attributeOnlyIfTrue(
"variadic", E.
Variadic);
561 case RQ_LValue:
JOS.attribute(
"refQualifier",
"&");
break;
562 case RQ_RValue:
JOS.attribute(
"refQualifier",
"&&");
break;
568 JOS.attribute(
"exceptionSpec",
"throw");
569 llvm::json::Array Types;
571 Types.push_back(createQualType(QT));
572 JOS.attribute(
"exceptionTypes", std::move(Types));
575 JOS.attribute(
"exceptionSpec",
"throw");
576 JOS.attribute(
"throwsAny",
true);
579 JOS.attribute(
"exceptionSpec",
"noexcept");
583 JOS.attribute(
"exceptionSpec",
"noexcept");
584 JOS.attribute(
"conditionEvaluatesTo",
590 JOS.attribute(
"exceptionSpec",
"nothrow");
612 JOS.attribute(
"sizeModifier",
"*");
615 JOS.attribute(
"sizeModifier",
"static");
623 JOS.attribute(
"indexTypeQualifiers", Str);
629 JOS.attribute(
"size", CAT->
getSize().getSExtValue());
636 "attrLoc", [VT,
this] { writeSourceLocation(VT->
getAttributeLoc()); });
645 JOS.attribute(
"vectorKind",
"altivec");
648 JOS.attribute(
"vectorKind",
"altivec pixel");
651 JOS.attribute(
"vectorKind",
"altivec bool");
654 JOS.attribute(
"vectorKind",
"neon");
657 JOS.attribute(
"vectorKind",
"neon poly");
660 JOS.attribute(
"vectorKind",
"fixed-length sve data vector");
663 JOS.attribute(
"vectorKind",
"fixed-length sve predicate vector");
669 JOS.attribute(
"decl", createBareDeclRef(UUT->
getDecl()));
674#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
675 case UnaryTransformType::Enum: \
676 JOS.attribute("transformKind", #Trait); \
678#include "clang/Basic/TransformTypeTraits.def"
683 JOS.attribute(
"decl", createBareDeclRef(TT->
getDecl()));
691 JOS.attribute(
"decl", createBareDeclRef(TTPT->
getDecl()));
698 JOS.attribute(
"pack_index", *PackIndex);
710 JOS.attribute(
"typeKeyword",
"auto");
713 JOS.attribute(
"typeKeyword",
"decltype(auto)");
716 JOS.attribute(
"typeKeyword",
"__auto_type");
723 attributeOnlyIfTrue(
"isAlias", TST->
isTypeAlias());
726 llvm::raw_string_ostream OS(Str);
728 JOS.attribute(
"templateName", OS.str());
733 JOS.attribute(
"decl", createBareDeclRef(ICNT->
getDecl()));
737 JOS.attribute(
"decl", createBareDeclRef(OIT->
getDecl()));
742 JOS.attribute(
"numExpansions", *N);
748 llvm::raw_string_ostream OS(Str);
749 NNS->print(OS, PrintPolicy,
true);
750 JOS.attribute(
"qualifier", OS.str());
753 JOS.attribute(
"ownedTagDecl", createBareDeclRef(TD));
775 auto *VD = dyn_cast<VarDecl>(ND);
776 if (VD && VD->hasLocalStorage())
779 std::string MangledName = ASTNameGen.
getName(ND);
780 if (!MangledName.empty())
781 JOS.attribute(
"mangledName", MangledName);
797 attributeOnlyIfTrue(
"isInline", ND->
isInline());
798 attributeOnlyIfTrue(
"isNested", ND->
isNested());
800 JOS.attribute(
"originalNamespace",
805 JOS.attribute(
"nominatedNamespace",
811 JOS.attribute(
"aliasedNamespace",
818 llvm::raw_string_ostream SOS(Name);
822 JOS.attribute(
"name", Name);
835 JOS.attribute(
"type", createQualType(VD->
getType()));
846 attributeOnlyIfTrue(
"inline", VD->
isInline());
847 attributeOnlyIfTrue(
"constexpr", VD->
isConstexpr());
855 JOS.attribute(
"init",
"paren-list");
864 JOS.attribute(
"type", createQualType(FD->
getType()));
865 attributeOnlyIfTrue(
"mutable", FD->
isMutable());
867 attributeOnlyIfTrue(
"isBitfield", FD->
isBitField());
873 JOS.attribute(
"type", createQualType(FD->
getType()));
879 attributeOnlyIfTrue(
"pure", FD->
isPure());
881 attributeOnlyIfTrue(
"constexpr", FD->
isConstexpr());
882 attributeOnlyIfTrue(
"variadic", FD->
isVariadic());
885 JOS.attribute(
"explicitlyDefaulted",
886 FD->
isDeleted() ?
"deleted" :
"default");
894 JOS.attribute(
"scopedEnumTag",
899 JOS.attribute(
"type", createQualType(ECD->
getType()));
914 JOS.attribute(
"definitionData", createCXXRecordDefinitionData(RD));
916 JOS.attributeArray(
"bases", [
this, RD] {
917 for (
const auto &Spec : RD->
bases())
918 JOS.value(createCXXBaseSpecifier(Spec));
925 JOS.attribute(
"bufferKind", D->
isCBuffer() ?
"cbuffer" :
"tbuffer");
936 JOS.attributeObject(
"defaultArg", [=] {
946 JOS.attribute(
"type", createQualType(D->
getType()));
952 JOS.attributeObject(
"defaultArg", [=] {
967 JOS.attributeObject(
"defaultArg", [=] {
970 InheritedFrom ? InheritedFrom->getSourceRange() :
SourceLocation{},
982 JOS.attribute(
"language", Lang);
983 attributeOnlyIfTrue(
"hasBraces", LSD->
hasBraces());
987 JOS.attribute(
"access", createAccessSpecifier(ASD->
getAccess()));
992 JOS.attribute(
"type", createQualType(T->getType()));
997 JOS.attribute(
"type", createQualType(D->
getType()));
1012 attributeOnlyIfTrue(
"variadic", D->
isVariadic());
1023 JOS.attribute(
"variance",
"covariant");
1026 JOS.attribute(
"variance",
"contravariant");
1036 llvm::json::Array Protocols;
1038 Protocols.push_back(createBareDeclRef(
P));
1039 if (!Protocols.empty())
1040 JOS.attribute(
"protocols", std::move(Protocols));
1052 llvm::json::Array Protocols;
1054 Protocols.push_back(createBareDeclRef(
P));
1055 if (!Protocols.empty())
1056 JOS.attribute(
"protocols", std::move(Protocols));
1064 llvm::json::Array Protocols;
1066 Protocols.push_back(createBareDeclRef(
P));
1067 if (!Protocols.empty())
1068 JOS.attribute(
"protocols", std::move(Protocols));
1086 JOS.attribute(
"type", createQualType(D->
getType()));
1100 attributeOnlyIfTrue(
"readonly",
1103 attributeOnlyIfTrue(
"readwrite",
1107 attributeOnlyIfTrue(
"nonatomic",
1112 attributeOnlyIfTrue(
"unsafe_unretained",
1116 attributeOnlyIfTrue(
"nullability",
1118 attributeOnlyIfTrue(
"null_resettable",
1134 attributeOnlyIfTrue(
"variadic", D->
isVariadic());
1144 llvm::raw_string_ostream OS(Str);
1147 JOS.attribute(
"selector", OS.str());
1151 JOS.attribute(
"receiverKind",
"instance");
1154 JOS.attribute(
"receiverKind",
"class");
1158 JOS.attribute(
"receiverKind",
"super (instance)");
1162 JOS.attribute(
"receiverKind",
"super (class)");
1168 if (OME->
getType() != CallReturnTy)
1169 JOS.attribute(
"callReturnType", createQualType(CallReturnTy));
1175 llvm::raw_string_ostream OS(Str);
1177 MD->getSelector().print(OS);
1178 JOS.attribute(
"selector", OS.str());
1184 llvm::raw_string_ostream OS(Str);
1187 JOS.attribute(
"selector", OS.str());
1191 JOS.attribute(
"protocol", createBareDeclRef(OPE->
getProtocol()));
1196 JOS.attribute(
"propertyKind",
"implicit");
1198 JOS.attribute(
"getter", createBareDeclRef(MD));
1200 JOS.attribute(
"setter", createBareDeclRef(MD));
1202 JOS.attribute(
"propertyKind",
"explicit");
1213 JOS.attribute(
"subscriptKind",
1217 JOS.attribute(
"getter", createBareDeclRef(MD));
1219 JOS.attribute(
"setter", createBareDeclRef(MD));
1223 JOS.attribute(
"decl", createBareDeclRef(OIRE->
getDecl()));
1224 attributeOnlyIfTrue(
"isFreeIvar", OIRE->
isFreeIvar());
1229 JOS.attribute(
"value", OBLE->
getValue() ?
"__objc_yes" :
"__objc_no");
1233 JOS.attribute(
"referencedDecl", createBareDeclRef(DRE->
getDecl()));
1235 JOS.attribute(
"foundReferencedDecl",
1247 JOS.attribute(
"typeSourceInfo",
1259 JOS.attribute(
"canOverflow",
false);
1270 JOS.attribute(
"computeResultType",
1280 JOS.attribute(
"referencedMemberDecl", createPointerRepresentation(VD));
1290 attributeOnlyIfTrue(
"isGlobal", NE->isGlobalNew());
1291 attributeOnlyIfTrue(
"isArray", NE->isArray());
1292 attributeOnlyIfTrue(
"isPlacement", NE->getNumPlacementArgs() != 0);
1293 switch (NE->getInitializationStyle()) {
1299 JOS.attribute(
"operatorNewDecl", createBareDeclRef(FD));
1301 JOS.attribute(
"operatorDeleteDecl", createBareDeclRef(FD));
1305 attributeOnlyIfTrue(
"isArray", DE->
isArrayForm());
1308 JOS.attribute(
"operatorDeleteDecl", createBareDeclRef(FD));
1312 attributeOnlyIfTrue(
"implicit", TE->
isImplicit());
1317 llvm::json::Array Path = createCastPath(CE);
1319 JOS.attribute(
"path", std::move(Path));
1323 JOS.attribute(
"conversionFunc", createBareDeclRef(ND));
1332 attributeOnlyIfTrue(
"adl", CE->
usesADL());
1351 JOS.attributeArray(
"lookups", [
this, ULE] {
1353 JOS.value(createBareDeclRef(D));
1359 JOS.attribute(
"labelDeclId", createPointerRepresentation(ALE->
getLabel()));
1366 JOS.attribute(
"typeArg", createQualType(Unadjusted));
1367 if (Adjusted != Unadjusted)
1368 JOS.attribute(
"adjustedTypeArg", createQualType(Adjusted));
1379 JOS.attribute(
"field", createBareDeclRef(FD));
1396 JOS.attribute(
"ctorType", createQualType(Ctor->
getType()));
1397 attributeOnlyIfTrue(
"elidable", CE->
isElidable());
1405 JOS.attribute(
"constructionKind",
"complete");
1408 JOS.attribute(
"constructionKind",
"delegating");
1411 JOS.attribute(
"constructionKind",
"non-virtual base");
1414 JOS.attribute(
"constructionKind",
"virtual base");
1420 attributeOnlyIfTrue(
"cleanupsHaveSideEffects",
1423 JOS.attributeArray(
"cleanups", [
this, EWC] {
1426 JOS.value(createBareDeclRef(BD));
1428 llvm::json::Object Obj;
1429 Obj[
"id"] = createPointerRepresentation(CLE);
1430 Obj[
"kind"] = CLE->getStmtClassName();
1431 JOS.value(std::move(Obj));
1433 llvm_unreachable(
"unexpected cleanup object type");
1442 JOS.attribute(
"temp", createPointerRepresentation(Temp));
1444 JOS.attribute(
"dtor", createBareDeclRef(Dtor));
1450 JOS.attribute(
"extendingDecl", createBareDeclRef(VD));
1454 JOS.attribute(
"storageDuration",
"automatic");
1457 JOS.attribute(
"storageDuration",
"dynamic");
1460 JOS.attribute(
"storageDuration",
"full expression");
1463 JOS.attribute(
"storageDuration",
"static");
1466 JOS.attribute(
"storageDuration",
"thread");
1478 attributeOnlyIfTrue(
"hasExplicitTemplateArgs",
1482 JOS.attributeArray(
"explicitTemplateArgs", [DSME,
this] {
1485 [&TAL,
this] { Visit(TAL.getArgument(), TAL.getSourceRange()); });
1499 JOS.attribute(
"value", Buffer);
1514 JOS.attribute(
"value", Buffer);
1518 llvm::raw_string_ostream SS(Buffer);
1520 JOS.attribute(
"value", SS.str());
1530 attributeOnlyIfTrue(
"isConstexpr", IS->
isConstexpr());
1531 attributeOnlyIfTrue(
"isConsteval", IS->
isConsteval());
1545 JOS.attribute(
"declId", createPointerRepresentation(LS->
getDecl()));
1546 attributeOnlyIfTrue(
"sideEntry", LS->
isSideEntry());
1549 JOS.attribute(
"targetLabelDeclId",
1550 createPointerRepresentation(GS->
getLabel()));
1565 JOS.attribute(
"isNull",
true);
1572 JOS.attribute(
"decl", createBareDeclRef(TA.
getAsDecl()));
1575 JOS.attribute(
"isNullptr",
true);
1591 JOS.attribute(
"isExpr",
true);
1594 JOS.attribute(
"isPack",
true);
1597StringRef JSONNodeDumper::getCommentCommandName(
unsigned CommandID)
const {
1608 JOS.attribute(
"text",
C->getText());
1613 JOS.attribute(
"name", getCommentCommandName(
C->getCommandID()));
1615 switch (
C->getRenderKind()) {
1617 JOS.attribute(
"renderKind",
"normal");
1620 JOS.attribute(
"renderKind",
"bold");
1623 JOS.attribute(
"renderKind",
"emphasized");
1626 JOS.attribute(
"renderKind",
"monospaced");
1629 JOS.attribute(
"renderKind",
"anchor");
1633 llvm::json::Array Args;
1634 for (
unsigned I = 0, E =
C->getNumArgs(); I < E; ++I)
1635 Args.push_back(
C->getArgText(I));
1638 JOS.attribute(
"args", std::move(Args));
1643 JOS.attribute(
"name",
C->getTagName());
1644 attributeOnlyIfTrue(
"selfClosing",
C->isSelfClosing());
1645 attributeOnlyIfTrue(
"malformed",
C->isMalformed());
1647 llvm::json::Array Attrs;
1648 for (
unsigned I = 0, E =
C->getNumAttrs(); I < E; ++I)
1650 {{
"name",
C->getAttr(I).Name}, {
"value",
C->getAttr(I).
Value}});
1653 JOS.attribute(
"attrs", std::move(Attrs));
1658 JOS.attribute(
"name",
C->getTagName());
1663 JOS.attribute(
"name", getCommentCommandName(
C->getCommandID()));
1665 llvm::json::Array Args;
1666 for (
unsigned I = 0, E =
C->getNumArgs(); I < E; ++I)
1667 Args.push_back(
C->getArgText(I));
1670 JOS.attribute(
"args", std::move(Args));
1675 switch (
C->getDirection()) {
1677 JOS.attribute(
"direction",
"in");
1680 JOS.attribute(
"direction",
"out");
1683 JOS.attribute(
"direction",
"in,out");
1686 attributeOnlyIfTrue(
"explicit",
C->isDirectionExplicit());
1688 if (
C->hasParamName())
1689 JOS.attribute(
"param",
C->isParamIndexValid() ?
C->getParamName(FC)
1690 :
C->getParamNameAsWritten());
1692 if (
C->isParamIndexValid() && !
C->isVarArgParam())
1693 JOS.attribute(
"paramIdx",
C->getParamIndex());
1698 if (
C->hasParamName())
1699 JOS.attribute(
"param",
C->isPositionValid() ?
C->getParamName(FC)
1700 :
C->getParamNameAsWritten());
1701 if (
C->isPositionValid()) {
1702 llvm::json::Array Positions;
1703 for (
unsigned I = 0, E =
C->getDepth(); I < E; ++I)
1704 Positions.push_back(
C->getIndex(I));
1706 if (!Positions.empty())
1707 JOS.attribute(
"positions", std::move(Positions));
1713 JOS.attribute(
"name", getCommentCommandName(
C->getCommandID()));
1714 JOS.attribute(
"closeName",
C->getCloseName());
1720 JOS.attribute(
"text",
C->getText());
1725 JOS.attribute(
"text",
C->getText());
1729 llvm::json::Object Ret;
1730#define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1731 if (FPO.has##NAME##Override()) \
1732 Ret.try_emplace(#NAME, static_cast<unsigned>(FPO.get##NAME##Override()));
1733#include "clang/Basic/FPOptions.def"
1739 if (S->hasStoredFPFeatures())
1740 JOS.attribute(
"fpoptions", createFPOptions(S->getStoredFPFeatures()));
static bool isTrivial(ASTContext &Ctx, const Expr *E)
Checks if the expression is constant or does not have non-trivial function calls.
static llvm::json::Object createMoveAssignmentDefinitionData(const CXXRecordDecl *RD)
#define FIELD2(Name, Flag)
static llvm::json::Object createCopyAssignmentDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createCopyConstructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createDestructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createDefaultConstructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createMoveConstructorDefinitionData(const CXXRecordDecl *RD)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
@ None
There is no such object (it's outside its lifetime).
const LangOptions & getLangOpts() const
const clang::PrintingPolicy & getPrintingPolicy() const
std::string getName(const Decl *D)
Represents an access specifier followed by colon ':'.
AddrLabelExpr - The GNU address of label extension, representing &&label.
LabelDecl * getLabel() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
ArraySizeModifier getSizeModifier() const
Qualifiers getIndexTypeQualifiers() const
Attr - This represents one attribute.
attr::Kind getKind() const
bool isImplicit() const
Returns true if the attribute has been implicitly created instead of explicitly written by the user.
SourceRange getRange() const
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
AutoTypeKeyword getKeyword() const
A builtin binary operation expression such as "x + y" or "x <= y".
StringRef getOpcodeStr() const
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool capturesCXXThis() const
Represents a base class of a C++ class.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
QualType getType() const
Retrieves the type of the base class.
bool isPackExpansion() const
Determine whether this base specifier is a pack expansion.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
A boolean literal, per ([C++ lex.bool] Boolean literals).
Represents a call to a C++ constructor.
bool isElidable() const
Whether this construction is elidable.
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
ConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
Represents a delete expression for memory deallocation and destructor calls, e.g.
FunctionDecl * getOperatorDelete() const
bool isGlobalDelete() const
bool isArrayFormAsWritten() const
Represents a C++ member access expression where the actual member referenced could not be resolved be...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Represents a C++ destructor within a class.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
@ ListInit
New-expression has a C++11 list-initializer.
@ CallInit
New-expression has a C++98 paren-delimited initializer.
@ NoInit
New-expression has no initializer as written.
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Represents a C++ temporary.
const CXXDestructorDecl * getDestructor() const
Represents the this expression in C++.
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
QualType getTypeOperand(ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
bool isListInitialization() const
Determine whether this expression models list-initialization.
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CaseStmt - Represent a case statement.
bool caseStmtIsGNURange() const
True if this case statement is of the form case LHS ... RHS, which is a GNU extension.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
static const char * getCastKindName(CastKind CK)
unsigned getValue() const
CompoundAssignOperator - For compound assignments (e.g.
QualType getComputationLHSType() const
QualType getComputationResultType() const
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
Represents the canonical version of C arrays with a specified constant size.
const llvm::APInt & getSize() const
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
APValue getAPValueResult() const
APValue::ValueKind getResultAPValueKind() const
A reference to a declared variable, function, enum, etc.
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isInvalidDecl() const
SourceLocation getLocation() const
const char * getDeclKindName() const
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
std::string getAsString() const
Retrieve the human-readable string for this name.
const ParmDecl * getInheritedFrom() const
Get the parameter from which we inherit the default argument, if any.
Represents an extended vector type where either the type or size is dependent.
SourceLocation getAttributeLoc() const
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
TagDecl * getOwnedTagDecl() const
Return the (re)declaration of this type owned by this occurrence of this type, or nullptr if there is...
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
An instance of this object exists for each enum constant that is defined.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
bool cleanupsHaveSideEffects() const
ArrayRef< CleanupObject > getObjects() const
unsigned getNumObjects() const
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
bool isValueDependent() const
Determines whether the value of this expression depends on.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
bool isBitField() const
Determines whether this field is a bitfield.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
std::string getValueAsString(unsigned Radix) const
llvm::APFloat getValue() const
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Represents a function declaration or definition.
bool isPure() const
Whether this virtual function is pure, i.e.
bool isVariadic() const
Whether this function is variadic.
bool isDeleted() const
Whether this function has been deleted.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
bool isDefaulted() const
Whether this function is defaulted.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
unsigned getRegParm() const
bool getHasRegParm() const
bool getProducesResult() const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
Represents a C11 generic selection.
AssociationTy< true > ConstAssociation
bool isResultDependent() const
Whether this generic selection is result-dependent.
GotoStmt - This represents a direct goto.
LabelDecl * getLabel() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
bool hasElseStorage() const
True if this IfStmt has storage for an else statement.
bool hasVarStorage() const
True if this IfStmt has storage for a variable declaration.
bool hasInitStorage() const
True if this IfStmt has the storage for an init statement.
bool isNegatedConsteval() const
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
bool isPartOfExplicitCast() const
Describes an C or C++ initializer list.
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
The injected class name of a C++ class template or class template partial specialization.
CXXRecordDecl * getDecl() const
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *OSRE)
void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D)
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *ULE)
void VisitCaseStmt(const CaseStmt *CS)
void VisitImplicitCastExpr(const ImplicitCastExpr *ICE)
void VisitNamespaceAliasDecl(const NamespaceAliasDecl *NAD)
void VisitFunctionProtoType(const FunctionProtoType *T)
void VisitObjCImplementationDecl(const ObjCImplementationDecl *D)
void VisitVectorType(const VectorType *VT)
void VisitFunctionDecl(const FunctionDecl *FD)
void VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE)
void VisitUsingDecl(const UsingDecl *UD)
void VisitEnumConstantDecl(const EnumConstantDecl *ECD)
void VisitConstantExpr(const ConstantExpr *CE)
void VisitRequiresExpr(const RequiresExpr *RE)
void VisitExprWithCleanups(const ExprWithCleanups *EWC)
void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *BLE)
void VisitTagType(const TagType *TT)
void Visit(const Attr *A)
void VisitLabelStmt(const LabelStmt *LS)
void VisitRValueReferenceType(const ReferenceType *RT)
void VisitObjCInterfaceType(const ObjCInterfaceType *OIT)
void VisitCXXConstructExpr(const CXXConstructExpr *CE)
void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE)
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *ME)
void VisitStringLiteral(const StringLiteral *SL)
void VisitBlockDecl(const BlockDecl *D)
void VisitSizeOfPackExpr(const SizeOfPackExpr *SOPE)
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *UCE)
void VisitCXXTypeidExpr(const CXXTypeidExpr *CTE)
void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D)
void VisitAccessSpecDecl(const AccessSpecDecl *ASD)
void VisitMemberPointerType(const MemberPointerType *MPT)
void VisitMemberExpr(const MemberExpr *ME)
void visitBlockCommandComment(const comments::BlockCommandComment *C, const comments::FullComment *)
void VisitCXXRecordDecl(const CXXRecordDecl *RD)
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D)
void VisitSwitchStmt(const SwitchStmt *SS)
void visitHTMLEndTagComment(const comments::HTMLEndTagComment *C, const comments::FullComment *)
void VisitBinaryOperator(const BinaryOperator *BO)
void visitVerbatimBlockLineComment(const comments::VerbatimBlockLineComment *C, const comments::FullComment *)
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D)
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D)
void VisitLinkageSpecDecl(const LinkageSpecDecl *LSD)
void VisitTypedefDecl(const TypedefDecl *TD)
void VisitTypedefType(const TypedefType *TT)
void VisitUnresolvedUsingType(const UnresolvedUsingType *UUT)
void VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T)
void VisitElaboratedType(const ElaboratedType *ET)
void VisitUnaryTransformType(const UnaryTransformType *UTT)
void VisitCallExpr(const CallExpr *CE)
void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO)
void visitParamCommandComment(const comments::ParamCommandComment *C, const comments::FullComment *FC)
void visitVerbatimBlockComment(const comments::VerbatimBlockComment *C, const comments::FullComment *)
void VisitUsingShadowDecl(const UsingShadowDecl *USD)
void VisitFloatingLiteral(const FloatingLiteral *FL)
void VisitTemplateTypeParmType(const TemplateTypeParmType *TTPT)
void VisitUsingDirectiveDecl(const UsingDirectiveDecl *UDD)
void VisitTemplateSpecializationType(const TemplateSpecializationType *TST)
void VisitWhileStmt(const WhileStmt *WS)
void VisitDeclarationTemplateArgument(const TemplateArgument &TA)
void VisitVarDecl(const VarDecl *VD)
void VisitEnumDecl(const EnumDecl *ED)
void VisitPackTemplateArgument(const TemplateArgument &TA)
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA)
void visitTextComment(const comments::TextComment *C, const comments::FullComment *)
void VisitFieldDecl(const FieldDecl *FD)
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE)
void VisitIntegralTemplateArgument(const TemplateArgument &TA)
void VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE)
void VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E)
void VisitDeclRefExpr(const DeclRefExpr *DRE)
void VisitNullPtrTemplateArgument(const TemplateArgument &TA)
void VisitNamespaceDecl(const NamespaceDecl *ND)
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE)
void visitVerbatimLineComment(const comments::VerbatimLineComment *C, const comments::FullComment *)
void VisitAutoType(const AutoType *AT)
void VisitObjCIvarDecl(const ObjCIvarDecl *D)
void VisitMacroQualifiedType(const MacroQualifiedType *MQT)
void VisitObjCPropertyDecl(const ObjCPropertyDecl *D)
void VisitObjCMethodDecl(const ObjCMethodDecl *D)
void visitTParamCommandComment(const comments::TParamCommandComment *C, const comments::FullComment *FC)
void VisitAddrLabelExpr(const AddrLabelExpr *ALE)
void VisitPredefinedExpr(const PredefinedExpr *PE)
void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D)
void VisitPackExpansionType(const PackExpansionType *PET)
void VisitDependentSizedExtVectorType(const DependentSizedExtVectorType *VT)
void visitHTMLStartTagComment(const comments::HTMLStartTagComment *C, const comments::FullComment *)
void VisitUsingType(const UsingType *TT)
void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *STTPT)
void VisitArrayType(const ArrayType *AT)
void VisitTypeTemplateArgument(const TemplateArgument &TA)
void VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE)
void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D)
void VisitGenericSelectionExpr(const GenericSelectionExpr *GSE)
void VisitTemplateTemplateArgument(const TemplateArgument &TA)
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *OBLE)
void VisitFixedPointLiteral(const FixedPointLiteral *FPL)
void VisitGotoStmt(const GotoStmt *GS)
void VisitCharacterLiteral(const CharacterLiteral *CL)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitObjCProtocolDecl(const ObjCProtocolDecl *D)
void VisitCompoundStmt(const CompoundStmt *IS)
void VisitHLSLBufferDecl(const HLSLBufferDecl *D)
void VisitCXXThisExpr(const CXXThisExpr *TE)
void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *OPRE)
void VisitConstantArrayType(const ConstantArrayType *CAT)
void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D)
void VisitCXXNewExpr(const CXXNewExpr *NE)
void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *OACS)
void VisitNullTemplateArgument(const TemplateArgument &TA)
void VisitCastExpr(const CastExpr *CE)
void VisitInjectedClassNameType(const InjectedClassNameType *ICNT)
void VisitIfStmt(const IfStmt *IS)
void VisitUnaryOperator(const UnaryOperator *UO)
void visitInlineCommandComment(const comments::InlineCommandComment *C, const comments::FullComment *)
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *TTE)
void VisitIntegerLiteral(const IntegerLiteral *IL)
void VisitUsingEnumDecl(const UsingEnumDecl *UED)
void VisitObjCMessageExpr(const ObjCMessageExpr *OME)
void VisitFunctionType(const FunctionType *T)
void VisitRecordDecl(const RecordDecl *RD)
void VisitTypeAliasDecl(const TypeAliasDecl *TAD)
void VisitExpressionTemplateArgument(const TemplateArgument &TA)
void VisitNamedDecl(const NamedDecl *ND)
void VisitObjCCategoryDecl(const ObjCCategoryDecl *D)
void VisitFriendDecl(const FriendDecl *FD)
void VisitCXXDeleteExpr(const CXXDeleteExpr *DE)
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE)
LabelStmt - Represents a label, which has a substatement.
LabelDecl * getDecl() const
const char * getName() const
static unsigned MeasureTokenLength(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
MeasureTokenLength - Relex the token at the specified location and return its length in bytes in the ...
Represents a linkage specification.
LanguageIDs getLanguage() const
Return the language specified by this linkage specification.
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
const IdentifierInfo * getMacroIdentifier() const
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
bool isBoundToLvalueReference() const
Determine whether this materialized temporary is bound to an lvalue reference; otherwise,...
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why? This is only meaningful if the named memb...
A pointer to member type per C++ 8.3.3 - Pointers to members.
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
bool isMemberDataPointer() const
Returns true if the member type (i.e.
This represents a decl that may have a name.
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
Represents a C++ namespace alias.
NamedDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
Represent a C++ namespace.
bool isOriginalNamespace() const
Return true if this declaration is an original (first) declaration of the namespace.
bool isInline() const
Returns true if this is an inline namespace declaration.
NamespaceDecl * getOriginalNamespace()
Get the original (first) namespace declaration.
bool isNested() const
Returns true if this is a nested namespace declaration.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
const DefArgStorage & getDefaultArgStorage() const
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
Expr * getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getDepth() const
Get the nesting depth of the template parameter.
This is a basic class for representing single OpenMP clause.
Represents Objective-C's @catch statement.
const VarDecl * getCatchParamDecl() const
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
ObjCBoxedExpr - used for generalized expression boxing.
ObjCMethodDecl * getBoxingMethod() const
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl * getImplementation() const
ObjCInterfaceDecl * getClassInterface()
protocol_range protocols() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCategoryDecl * getCategoryDecl() const
ObjCCompatibleAliasDecl - Represents alias of a class.
const ObjCInterfaceDecl * getClassInterface() const
ObjCEncodeExpr, used for @encode in Objective-C.
QualType getEncodedType() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
const ObjCInterfaceDecl * getSuperClass() const
Represents an ObjC class declaration.
protocol_range protocols() const
ObjCImplementationDecl * getImplementation() const
ObjCInterfaceDecl * getSuperClass() const
Interfaces are the core concept in Objective-C for object oriented design.
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getAccessControl() const
bool getSynthesize() const
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
QualType getCallReturnType(ASTContext &Ctx) const
Selector getSelector() const
@ SuperInstance
The receiver is the instance of the superclass object.
@ Instance
The receiver is an object instance.
@ SuperClass
The receiver is a superclass.
@ Class
The receiver is a class.
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
QualType getSuperType() const
Retrieve the type referred to by 'super'.
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
ObjCMethodDecl - Represents an instance or class method declaration.
bool isInstanceMethod() const
QualType getReturnType() const
Represents one property declaration in an Objective-C interface.
ObjCMethodDecl * getGetterMethodDecl() const
ObjCMethodDecl * getSetterMethodDecl() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
PropertyControl getPropertyImplementation() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
Kind getPropertyImplementation() const
ObjCPropertyDecl * getPropertyDecl() const
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
bool isMessagingGetter() const
True if the property reference will result in a message to the getter.
ObjCPropertyDecl * getExplicitProperty() const
bool isMessagingSetter() const
True if the property reference will result in a message to the setter.
ObjCMethodDecl * getImplicitPropertyGetter() const
bool isImplicitProperty() const
ObjCMethodDecl * getImplicitPropertySetter() const
bool isSuperReceiver() const
Represents an Objective-C protocol declaration.
protocol_range protocols() const
ObjCProtocolExpr used for protocol expression in Objective-C.
ObjCProtocolDecl * getProtocol() const
ObjCSelectorExpr used for @selector in Objective-C.
Selector getSelector() const
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
bool isArraySubscriptRefExpr() const
ObjCMethodDecl * getAtIndexMethodDecl() const
ObjCMethodDecl * setAtIndexMethodDecl() const
Represents the declaration of an Objective-C type parameter.
bool hasExplicitBound() const
Whether this type parameter has an explicitly-written type bound, e.g., "T : NSView".
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
llvm::iterator_range< decls_iterator > decls() const
DeclarationName getName() const
Gets the name looked up.
Represents a pack expansion of types.
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
[C99 6.4.2.2] - A predefined identifier such as func.
StringRef getIdentKindName() const
IdentKind getIdentKind() const
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
SourceLocation getIncludeLoc() const
Return the presumed include location of this location.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
SplitQualType getSplitDesugaredType() const
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
std::string getAsString() const
void * getAsOpaquePtr() const
std::string getAsString() const
Represents a struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Base for LValueReferenceType and RValueReferenceType.
bool isSpelledAsLValue() const
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
bool isSatisfied() const
Whether or not the requires clause is satisfied.
TypeSourceInfo * getTypeSourceInfo()
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
Represents an expression that computes the length of a parameter pack.
NamedDecl * getPack() const
Retrieve the parameter pack.
Encodes a location in the source.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
bool isMacroArgExpansion(SourceLocation Loc, SourceLocation *StartLoc=nullptr) const
Tests whether the given source location represents a macro argument's expansion into the function-lik...
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
unsigned getSpellingLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
RetTy Visit(PTR(Stmt) S, ParamTys... P)
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
void outputString(raw_ostream &OS) const
Represents the result of substituting a set of types for a template type parameter pack.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Represents the result of substituting a type for a template type parameter.
std::optional< unsigned > getPackIndex() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
SwitchStmt - This represents a 'switch' stmt.
bool hasVarStorage() const
True if this SwitchStmt has storage for a condition variable.
bool hasInitStorage() const
True if this SwitchStmt has storage for an init statement.
Represents the declaration of a struct/union/class/enum.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getDecl() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
Represents a template argument.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
void print(raw_ostream &OS, const PrintingPolicy &Policy, Qualified Qual=Qualified::AsWritten) const
Print the template name.
Represents a type template specialization; the template must be a class template, a type alias templa...
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
bool isTypeAlias() const
Determine if this template specialization type is for a type alias template that has been substituted...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
const DefArgStorage & getDefaultArgStorage() const
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
QualType getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getIndex() const
Retrieve the index of the template parameter.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Returns whether this is a parameter pack.
unsigned getDepth() const
Retrieve the depth of the template parameter.
const DefArgStorage & getDefaultArgStorage() const
TemplateTypeParmDecl * getDecl() const
bool isParameterPack() const
unsigned getIndex() const
unsigned getDepth() const
Represents the declaration of a typedef-name via a C++11 alias-declaration.
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
void Visit(const Type *T)
Performs the operation associated with this visitor object.
The base class of the type hierarchy.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
const char * getTypeClassName() const
bool containsErrors() const
Whether this type is an error type.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isFromAST() const
Whether this type comes from an AST file.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
QualType getUnderlyingType() const
TypedefNameDecl * getDecl() const
bool typeMatchesDecl() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTrait getKind() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
Represents the dependent type named by a dependently-scoped typename using declaration,...
UnresolvedUsingTypenameDecl * getDecl() const
Represents a C++ using-declaration.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents C++ using-directive.
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Represents a C++ using-enum-declaration.
EnumDecl * getEnumDecl() const
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
UsingShadowDecl * getFoundDecl() const
bool typeMatchesDecl() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
@ ListInit
Direct list-initialization (C++11)
@ CInit
C-style initialization with assignment.
@ ParenListInit
Parenthesized list-initialization (C++20)
@ CallInit
Call-style initialization (C++98)
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
bool isInline() const
Whether this variable is (C++1z) inline.
@ TLS_Static
TLS with a known-constant initializer.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ TLS_None
Not a TLS variable.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
Represents a GCC generic vector type.
unsigned getNumElements() const
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthPredicateVector
is AArch64 SVE fixed-length predicate vector
@ NeonPolyVector
is ARM Neon polynomial vector
@ GenericVector
not a target-specific vector type
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ SveFixedLengthDataVector
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ NeonVector
is ARM Neon vector
VectorKind getVectorKind() const
WhileStmt - This represents a 'while' stmt.
bool hasVarStorage() const
True if this WhileStmt has storage for a condition variable.
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
bool containsUnexpandedParameterPack() const
RetTy Visit(REF(TemplateArgument) TA, ParamTys... P)
@ kind_nullability
Indicates that the nullability of the type was spelled with a property attribute rather than a type q...
bool Ret(InterpState &S, CodePtr &PC, APValue &Result)
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
StorageClass
Storage classes.
@ C
Languages that the frontend can parse and compile.
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ SD_Automatic
Automatic storage duration (most local variables).
@ SD_Dynamic
Dynamic storage duration.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T -> getSizeExpr()))
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_None
This is an odr-use.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
RefQualifierKind RefQualifier
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Qualifiers Quals
The local qualifiers.