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"},
59 {NKI_None,
"OffsetOfNode"},
71 if (
Base == NKI_None || Derived == NKI_None)
73 while (Derived !=
Base && Derived != NKI_None) {
74 Derived = AllKindInfo[Derived].ParentId;
76 return Derived ==
Base;
81 if (Base == NKI_None || Derived == NKI_None)
return false;
83 while (Derived != Base && Derived != NKI_None) {
84 Derived = AllKindInfo[Derived].ParentId;
89 return Derived ==
Base;
93 NodeKindId LastId = KindId;
95 NodeKindId ParentId = AllKindInfo[LastId].ParentId;
96 if (ParentId == NKI_None)
107 if (Kind1.
isBaseOf(Kind2))
return Kind2;
108 if (Kind2.
isBaseOf(Kind1))
return Kind1;
114 NodeKindId Parent = Kind1.KindId;
115 while (!
isBaseOf(Parent, Kind2.KindId) && Parent != NKI_None) {
116 Parent = AllKindInfo[Parent].ParentId;
123#define DECL(DERIVED, BASE) \
124 case Decl::DERIVED: return ASTNodeKind(NKI_##DERIVED##Decl);
125#define ABSTRACT_DECL(D)
126#include "clang/AST/DeclNodes.inc"
128 llvm_unreachable(
"invalid decl kind");
134#define STMT(CLASS, PARENT) \
135 case Stmt::CLASS##Class: return ASTNodeKind(NKI_##CLASS);
136#define ABSTRACT_STMT(S)
137#include "clang/AST/StmtNodes.inc"
139 llvm_unreachable(
"invalid stmt kind");
143 switch (T.getTypeClass()) {
144#define TYPE(Class, Base) \
145 case Type::Class: return ASTNodeKind(NKI_##Class##Type);
146#define ABSTRACT_TYPE(Class, Base)
147#include "clang/AST/TypeNodes.inc"
149 llvm_unreachable(
"invalid type kind");
153 switch (T.getTypeLocClass()) {
154#define ABSTRACT_TYPELOC(CLASS, PARENT)
155#define TYPELOC(CLASS, PARENT) \
156 case TypeLoc::CLASS: \
157 return ASTNodeKind(NKI_##CLASS##TypeLoc);
158#include "clang/AST/TypeLocNodes.def"
160 llvm_unreachable(
"invalid typeloc kind");
164 switch (
C.getClauseKind()) {
165#define GEN_CLANG_CLAUSE_CLASS
166#define CLAUSE_CLASS(Enum, Str, Class) \
167 case llvm::omp::Clause::Enum: \
168 return ASTNodeKind(NKI_##Class);
169#define CLAUSE_NO_CLASS(Enum, Str) \
170 case llvm::omp::Clause::Enum: \
171 llvm_unreachable("unexpected OpenMP clause kind");
172#include "llvm/Frontend/OpenMP/OMP.inc"
174 llvm_unreachable(
"invalid omp clause kind");
181 return ASTNodeKind(NKI_##A##Attr);
182#include "clang/Basic/AttrList.inc"
184 llvm_unreachable(
"invalid attr kind");
190 TA->print(PP, OS,
true);
192 TAL->getArgument().print(PP, OS,
true);
201 OS <<
"(empty NestedNameSpecifierLoc)";
205 TL->getType().print(OS, PP);
209 S->printPretty(OS,
nullptr, PP);
213 A->printPretty(OS, PP);
215 P->getProtocol()->print(OS, PP);
219 OS <<
"Unable to print values of type " << NodeKind.asStringRef() <<
"\n";
227 S->dump(OS, Context);
229 T->dump(OS, Context);
233 TL->dump(OS, Context);
235 OS <<
"Unable to dump values of type " << NodeKind.asStringRef() <<
"\n";
240 return CCI->getSourceRange();
242 return NNSL->getSourceRange();
244 if (IncludeQualifier)
245 return TL->getSourceRange();
246 switch (TL->getTypeLocClass()) {
247 case TypeLoc::DependentName:
249 case TypeLoc::TemplateSpecialization: {
251 return SourceRange(T.getTemplateNameLoc(), T.getEndLoc());
254 case TypeLoc::Record:
255 case TypeLoc::InjectedClassName:
257 case TypeLoc::Typedef:
259 case TypeLoc::UnresolvedUsing:
264 return TL->getSourceRange();
268 return D->getSourceRange();
270 return S->getSourceRange();
272 return TAL->getSourceRange();
276 return CBS->getSourceRange();
278 return A->getRange();
280 return P->getSourceRange();
282 return C->getSourceRange();
284 return O->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.
Helper class for OffsetOfExpr.
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.
@ Other
Other implicit parameter.
Describes how types, statements, expressions, and declarations should be printed.