27const ASTNodeKind::KindInfo ASTNodeKind::AllKindInfo[] = {
29 {NKI_None,
"TemplateArgument"},
30 {NKI_None,
"TemplateArgumentLoc"},
31 {NKI_None,
"LambdaCapture"},
32 {NKI_None,
"TemplateName"},
33 {NKI_None,
"NestedNameSpecifierLoc"},
34 {NKI_None,
"QualType"},
35#define TYPELOC(CLASS, PARENT) {NKI_##PARENT, #CLASS "TypeLoc"},
36#include "clang/AST/TypeLocNodes.def"
37 {NKI_None,
"TypeLoc"},
38 {NKI_None,
"CXXBaseSpecifier"},
39 {NKI_None,
"CXXCtorInitializer"},
40 {NKI_None,
"NestedNameSpecifier"},
42#define DECL(DERIVED, BASE) { NKI_##BASE, #DERIVED "Decl" },
43#include "clang/AST/DeclNodes.inc"
45#define STMT(DERIVED, BASE) { NKI_##BASE, #DERIVED },
46#include "clang/AST/StmtNodes.inc"
48#define TYPE(DERIVED, BASE) { NKI_##BASE, #DERIVED "Type" },
49#include "clang/AST/TypeNodes.inc"
50 {NKI_None,
"OMPClause"},
51#define GEN_CLANG_CLAUSE_CLASS
52#define CLAUSE_CLASS(Enum, Str, Class) {NKI_OMPClause, #Class},
53#include "llvm/Frontend/OpenMP/OMP.inc"
55#define ATTR(A) {NKI_Attr, #A "Attr"},
56#include "clang/Basic/AttrList.inc"
57 {NKI_None,
"ObjCProtocolLoc"},
58 {NKI_None,
"ConceptReference"},
70 if (
Base == NKI_None || Derived == NKI_None)
72 while (Derived !=
Base && Derived != NKI_None) {
73 Derived = AllKindInfo[Derived].ParentId;
75 return Derived ==
Base;
80 if (Base == NKI_None || Derived == NKI_None)
return false;
82 while (Derived != Base && Derived != NKI_None) {
83 Derived = AllKindInfo[Derived].ParentId;
88 return Derived ==
Base;
92 NodeKindId LastId = KindId;
94 NodeKindId ParentId = AllKindInfo[LastId].ParentId;
95 if (ParentId == NKI_None)
106 if (Kind1.
isBaseOf(Kind2))
return Kind2;
107 if (Kind2.
isBaseOf(Kind1))
return Kind1;
113 NodeKindId Parent = Kind1.KindId;
114 while (!
isBaseOf(Parent, Kind2.KindId) && Parent != NKI_None) {
115 Parent = AllKindInfo[Parent].ParentId;
122#define DECL(DERIVED, BASE) \
123 case Decl::DERIVED: return ASTNodeKind(NKI_##DERIVED##Decl);
124#define ABSTRACT_DECL(D)
125#include "clang/AST/DeclNodes.inc"
127 llvm_unreachable(
"invalid decl kind");
133#define STMT(CLASS, PARENT) \
134 case Stmt::CLASS##Class: return ASTNodeKind(NKI_##CLASS);
135#define ABSTRACT_STMT(S)
136#include "clang/AST/StmtNodes.inc"
138 llvm_unreachable(
"invalid stmt kind");
142 switch (
T.getTypeClass()) {
143#define TYPE(Class, Base) \
144 case Type::Class: return ASTNodeKind(NKI_##Class##Type);
145#define ABSTRACT_TYPE(Class, Base)
146#include "clang/AST/TypeNodes.inc"
148 llvm_unreachable(
"invalid type kind");
152 switch (
T.getTypeLocClass()) {
153#define ABSTRACT_TYPELOC(CLASS, PARENT)
154#define TYPELOC(CLASS, PARENT) \
155 case TypeLoc::CLASS: \
156 return ASTNodeKind(NKI_##CLASS##TypeLoc);
157#include "clang/AST/TypeLocNodes.def"
159 llvm_unreachable(
"invalid typeloc kind");
163 switch (
C.getClauseKind()) {
164#define GEN_CLANG_CLAUSE_CLASS
165#define CLAUSE_CLASS(Enum, Str, Class) \
166 case llvm::omp::Clause::Enum: \
167 return ASTNodeKind(NKI_##Class);
168#define CLAUSE_NO_CLASS(Enum, Str) \
169 case llvm::omp::Clause::Enum: \
170 llvm_unreachable("unexpected OpenMP clause kind");
171#include "llvm/Frontend/OpenMP/OMP.inc"
173 llvm_unreachable(
"invalid omp clause kind");
180 return ASTNodeKind(NKI_##A##Attr);
181#include "clang/Basic/AttrList.inc"
183 llvm_unreachable(
"invalid attr kind");
189 TA->print(PP, OS,
true);
191 TAL->getArgument().print(PP, OS,
true);
200 OS <<
"(empty NestedNameSpecifierLoc)";
204 TL->getType().print(OS, PP);
208 S->printPretty(OS,
nullptr, PP);
212 A->printPretty(OS, PP);
214 P->getProtocol()->print(OS, PP);
218 OS <<
"Unable to print values of type " << NodeKind.asStringRef() <<
"\n";
226 S->dump(OS, Context);
228 T->dump(OS, Context);
232 TL->dump(OS, Context);
234 OS <<
"Unable to dump values of type " << NodeKind.asStringRef() <<
"\n";
239 return CCI->getSourceRange();
241 return NNSL->getSourceRange();
243 if (IncludeQualifier)
244 return TL->getSourceRange();
245 switch (TL->getTypeLocClass()) {
246 case TypeLoc::DependentName:
248 case TypeLoc::TemplateSpecialization: {
253 case TypeLoc::Record:
254 case TypeLoc::InjectedClassName:
256 case TypeLoc::Typedef:
258 case TypeLoc::UnresolvedUsing:
263 return TL->getSourceRange();
267 return D->getSourceRange();
269 return S->getSourceRange();
271 return TAL->getSourceRange();
275 return CBS->getSourceRange();
277 return A->getRange();
279 return P->getSourceRange();
281 return C->getSourceRange();
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP AST classes for clauses.
Defines the clang::TypeLoc interface and its subclasses.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
StringRef asStringRef() const
String representation of the kind.
bool isBaseOf(ASTNodeKind Other) const
Returns true if this is a base kind of (or same as) Other.
constexpr ASTNodeKind()
Empty identifier. It matches nothing.
ASTNodeKind getCladeKind() const
static ASTNodeKind getMostDerivedCommonAncestor(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived common ancestor between Kind1 and Kind2.
static ASTNodeKind getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived type between Kind1 and Kind2.
static ASTNodeKind getFromNode(const Decl &D)
Attr - This represents one attribute.
attr::Kind getKind() const
Represents a C++ base or member initializer.
A reference to a concept and its template args, as it appears in the code.
Decl - This represents one declaration (or definition), e.g.
const T * get() const
Retrieve the stored node as type T.
void dump(llvm::raw_ostream &OS, const ASTContext &Context) const
Dumps the node to the given output stream.
SourceRange getSourceRange(bool IncludeQualifier=false) const
For nodes which represent textual entities in the source code, return their SourceRange.
void print(llvm::raw_ostream &OS, const PrintingPolicy &PP) const
Prints the node to the given output stream.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
This is a basic class for representing single OpenMP clause.
A (possibly-)qualified type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
StmtClass getStmtClass() const
Location wrapper for a TemplateArgument.
Represents a template argument.
Represents a C++ template name within the type system.
Base wrapper for a particular "section" of type source info.
The base class of the type hierarchy.
Wrapper for source info for typedefs.
Wrapper for source info for unresolved typename using decls.
Wrapper for source info for types used via transparent aliases.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
@ Other
Other implicit parameter.
Describes how types, statements, expressions, and declarations should be printed.