11 using namespace clang;
17 case NodeKind::TranslationUnit:
18 return OS <<
"TranslationUnit";
19 case NodeKind::UnknownExpression:
20 return OS <<
"UnknownExpression";
21 case NodeKind::UnknownStatement:
22 return OS <<
"UnknownStatement";
23 case NodeKind::DeclarationStatement:
24 return OS <<
"DeclarationStatement";
25 case NodeKind::EmptyStatement:
26 return OS <<
"EmptyStatement";
27 case NodeKind::SwitchStatement:
28 return OS <<
"SwitchStatement";
29 case NodeKind::CaseStatement:
30 return OS <<
"CaseStatement";
31 case NodeKind::DefaultStatement:
32 return OS <<
"DefaultStatement";
33 case NodeKind::IfStatement:
34 return OS <<
"IfStatement";
35 case NodeKind::ForStatement:
36 return OS <<
"ForStatement";
37 case NodeKind::WhileStatement:
38 return OS <<
"WhileStatement";
39 case NodeKind::ContinueStatement:
40 return OS <<
"ContinueStatement";
41 case NodeKind::BreakStatement:
42 return OS <<
"BreakStatement";
43 case NodeKind::ReturnStatement:
44 return OS <<
"ReturnStatement";
45 case NodeKind::RangeBasedForStatement:
46 return OS <<
"RangeBasedForStatement";
47 case NodeKind::ExpressionStatement:
48 return OS <<
"ExpressionStatement";
49 case NodeKind::CompoundStatement:
50 return OS <<
"CompoundStatement";
51 case NodeKind::UnknownDeclaration:
52 return OS <<
"UnknownDeclaration";
53 case NodeKind::EmptyDeclaration:
54 return OS <<
"EmptyDeclaration";
55 case NodeKind::StaticAssertDeclaration:
56 return OS <<
"StaticAssertDeclaration";
57 case NodeKind::LinkageSpecificationDeclaration:
58 return OS <<
"LinkageSpecificationDeclaration";
59 case NodeKind::SimpleDeclaration:
60 return OS <<
"SimpleDeclaration";
61 case NodeKind::NamespaceDefinition:
62 return OS <<
"NamespaceDefinition";
63 case NodeKind::NamespaceAliasDefinition:
64 return OS <<
"NamespaceAliasDefinition";
65 case NodeKind::UsingNamespaceDirective:
66 return OS <<
"UsingNamespaceDirective";
67 case NodeKind::UsingDeclaration:
68 return OS <<
"UsingDeclaration";
69 case NodeKind::TypeAliasDeclaration:
70 return OS <<
"TypeAliasDeclaration";
72 llvm_unreachable(
"unknown node kind");
78 return OS <<
"Detached";
80 return OS <<
"Unknown";
82 return OS <<
"OpenParen";
84 return OS <<
"CloseParen";
86 return OS <<
"IntroducerKeyword";
88 return OS <<
"BodyStatement";
90 return OS <<
"CaseStatement_value";
92 return OS <<
"IfStatement_thenStatement";
94 return OS <<
"IfStatement_elseKeyword";
96 return OS <<
"IfStatement_elseStatement";
98 return OS <<
"ReturnStatement_value";
100 return OS <<
"ExpressionStatement_expression";
102 return OS <<
"CompoundStatement_statement";
104 return OS <<
"StaticAssertDeclaration_condition";
106 return OS <<
"StaticAssertDeclaration_message";
108 llvm_unreachable(
"invalid role");
112 return llvm::cast_or_null<syntax::Leaf>(
117 return llvm::cast_or_null<syntax::Statement>(
122 return llvm::cast_or_null<syntax::Leaf>(
127 return llvm::cast_or_null<syntax::Expression>(
132 return llvm::cast_or_null<syntax::Statement>(
137 return llvm::cast_or_null<syntax::Leaf>(
142 return llvm::cast_or_null<syntax::Statement>(
147 return llvm::cast_or_null<syntax::Leaf>(
152 return llvm::cast_or_null<syntax::Statement>(
157 return llvm::cast_or_null<syntax::Leaf>(
162 return llvm::cast_or_null<syntax::Statement>(
167 return llvm::cast_or_null<syntax::Leaf>(
172 return llvm::cast_or_null<syntax::Statement>(
177 return llvm::cast_or_null<syntax::Leaf>(
182 return llvm::cast_or_null<syntax::Statement>(
187 return llvm::cast_or_null<syntax::Leaf>(
192 return llvm::cast_or_null<syntax::Leaf>(
197 return llvm::cast_or_null<syntax::Leaf>(
202 return llvm::cast_or_null<syntax::Expression>(
207 return llvm::cast_or_null<syntax::Leaf>(
212 return llvm::cast_or_null<syntax::Statement>(
217 return llvm::cast_or_null<syntax::Expression>(
222 return llvm::cast_or_null<syntax::Leaf>(
227 std::vector<syntax::Statement *> Children;
228 for (
auto *C =
firstChild(); C; C = C->nextSibling()) {
230 Children.push_back(llvm::cast<syntax::Statement>(C));
236 return llvm::cast_or_null<syntax::Leaf>(
241 return llvm::cast_or_null<syntax::Expression>(
246 return llvm::cast_or_null<syntax::Expression>(
An opening parenthesis in argument lists and blocks, e.g. '{', '(', etc.
Children of an unknown semantic nature, e.g. skipped tokens, comments.
syntax::Expression * value()
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, NodeKind K)
For debugging purposes.
syntax::Leaf * continueKeyword()
syntax::Leaf * caseKeyword()
syntax::Statement * thenStatement()
An inner statement for those that have only a single child of kind statement, e.g.
syntax::Expression * expression()
syntax::Statement * elseStatement()
std::vector< syntax::Statement * > statements()
FIXME: use custom iterator instead of 'vector'.
An abstract node for C++ statements, e.g.
syntax::Statement * body()
A keywords that introduces some grammar construct, e.g. 'if', 'try', etc.
syntax::Leaf * forKeyword()
syntax::Leaf * defaultKeyword()
syntax::Expression * message()
syntax::Leaf * elseKeyword()
A closing parenthesis in argument lists and blocks, e.g. '}', ')', etc.
NodeKind
A kind of a syntax node, used for implementing casts.
syntax::Statement * body()
syntax::Statement * body()
syntax::Expression * condition()
syntax::Leaf * forKeyword()
syntax::Statement * body()
syntax::Leaf * returnKeyword()
syntax::Leaf * switchKeyword()
syntax::Statement * body()
NodeRole
A relation between a parent and child node, e.g.
Dataflow Directional Tag Classes.
syntax::Statement * body()
A leaf node points to a single token inside the expanded token stream.
A base class for all expressions.
Defines the clang::TokenKind enum and support functions.
syntax::Leaf * whileKeyword()
syntax::Leaf * ifKeyword()
syntax::Leaf * breakKeyword()
syntax::Node * findChild(NodeRole R)
Find the first node with a corresponding role.
syntax::Expression * value()