21 namespace ast_type_traits {
23 const ASTNodeKind::KindInfo ASTNodeKind::AllKindInfo[] = {
24 { NKI_None,
"<None>" },
25 { NKI_None,
"CXXCtorInitializer" },
26 { NKI_None,
"TemplateArgument" },
27 { NKI_None,
"NestedNameSpecifier" },
28 { NKI_None,
"NestedNameSpecifierLoc" },
29 { NKI_None,
"QualType" },
30 { NKI_None,
"TypeLoc" },
32 #define DECL(DERIVED, BASE) { NKI_##BASE, #DERIVED "Decl" },
33 #include "clang/AST/DeclNodes.inc"
35 #define STMT(DERIVED, BASE) { NKI_##BASE, #DERIVED },
36 #include "clang/AST/StmtNodes.inc"
38 #define TYPE(DERIVED, BASE) { NKI_##BASE, #DERIVED "Type" },
39 #include "clang/AST/TypeNodes.def"
43 return isBaseOf(KindId, Other.KindId, Distance);
47 return KindId != NKI_None && KindId == Other.KindId;
52 if (Base == NKI_None || Derived == NKI_None)
return false;
54 while (Derived != Base && Derived != NKI_None) {
55 Derived = AllKindInfo[Derived].ParentId;
60 return Derived == Base;
67 if (Kind1.
isBaseOf(Kind2))
return Kind2;
68 if (Kind2.
isBaseOf(Kind1))
return Kind1;
74 NodeKindId Parent = Kind1.KindId;
75 while (!
isBaseOf(Parent, Kind2.KindId,
nullptr) && Parent != NKI_None) {
76 Parent = AllKindInfo[Parent].ParentId;
83 #define DECL(DERIVED, BASE) \
84 case Decl::DERIVED: return ASTNodeKind(NKI_##DERIVED##Decl);
85 #define ABSTRACT_DECL(D)
86 #include "clang/AST/DeclNodes.inc"
88 llvm_unreachable(
"invalid decl kind");
92 switch (S.getStmtClass()) {
93 case Stmt::NoStmtClass:
return NKI_None;
94 #define STMT(CLASS, PARENT) \
95 case Stmt::CLASS##Class: return ASTNodeKind(NKI_##CLASS);
96 #define ABSTRACT_STMT(S)
97 #include "clang/AST/StmtNodes.inc"
99 llvm_unreachable(
"invalid stmt kind");
104 #define TYPE(Class, Base) \
105 case Type::Class: return ASTNodeKind(NKI_##Class##Type);
106 #define ABSTRACT_TYPE(Class, Base)
107 #include "clang/AST/TypeNodes.def"
109 llvm_unreachable(
"invalid type kind");
119 NNSL->getNestedNameSpecifier()->print(OS, PP);
120 else if (
const QualType *QT = get<QualType>())
122 else if (
const TypeLoc *TL = get<TypeLoc>())
123 TL->getType().print(OS, PP);
124 else if (
const Decl *D = get<Decl>())
126 else if (
const Stmt *
S = get<Stmt>())
127 S->printPretty(OS,
nullptr, PP);
128 else if (
const Type *T = get<Type>())
131 OS <<
"Unable to print values of type " << NodeKind.
asStringRef() <<
"\n";
135 if (
const Decl *D = get<Decl>())
137 else if (
const Stmt *
S = get<Stmt>())
140 OS <<
"Unable to dump values of type " << NodeKind.
asStringRef() <<
"\n";
145 return CCI->getSourceRange();
147 return NNSL->getSourceRange();
148 if (
const TypeLoc *TL = get<TypeLoc>())
149 return TL->getSourceRange();
150 if (
const Decl *D = get<Decl>())
151 return D->getSourceRange();
152 if (
const Stmt *
S = get<Stmt>())
153 return S->getSourceRange();
Defines the clang::ASTContext interface.
static ASTNodeKind getFromNode(const Decl &D)
Construct an identifier for the dynamic type of the node.
Describes how types, statements, expressions, and declarations should be printed. ...
Base wrapper for a particular "section" of type source info.
A C++ nested-name-specifier augmented with source location information.
bool isBaseOf(ASTNodeKind Other, unsigned *Distance=nullptr) const
Returns true if this is a base kind of (or same as) Other.
ASTNodeKind()
Empty identifier. It matches nothing.
TypeClass getTypeClass() const
void dump(llvm::raw_ostream &OS, SourceManager &SM) const
Dumps the node to the given output stream.
static ASTNodeKind getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived type between Kind1 and Kind2.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine()) const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
StringRef asStringRef() const
String representation of the kind.
Represents a template argument.
static ASTNodeKind getMostDerivedCommonAncestor(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived common ancestor between Kind1 and Kind2.
bool isSame(ASTNodeKind Other) const
Returns true if this and Other represent the same kind.
Represents a C++ base or member initializer.
SourceRange getSourceRange() const
For nodes which represent textual entities in the source code, return their SourceRange. For all other nodes, return SourceRange().
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
A trivial tuple used to represent a source range.
void print(llvm::raw_ostream &OS, const PrintingPolicy &PP) const
Prints the node to the given output stream.
This class handles loading and caching of source files into memory.