17330f729Sjoerg //===- Nodes.cpp ----------------------------------------------*- C++ -*-=====//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg #include "clang/Tooling/Syntax/Nodes.h"
97330f729Sjoerg #include "clang/Basic/TokenKinds.h"
107330f729Sjoerg
117330f729Sjoerg using namespace clang;
127330f729Sjoerg
operator <<(raw_ostream & OS,NodeKind K)13*e038c9c4Sjoerg raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) {
147330f729Sjoerg switch (K) {
15*e038c9c4Sjoerg #define CONCRETE_NODE(Kind, Parent) \
16*e038c9c4Sjoerg case NodeKind::Kind: \
17*e038c9c4Sjoerg return OS << #Kind;
18*e038c9c4Sjoerg #include "clang/Tooling/Syntax/Nodes.inc"
197330f729Sjoerg }
207330f729Sjoerg llvm_unreachable("unknown node kind");
217330f729Sjoerg }
227330f729Sjoerg
operator <<(raw_ostream & OS,NodeRole R)23*e038c9c4Sjoerg raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) {
24*e038c9c4Sjoerg switch (R) {
25*e038c9c4Sjoerg case syntax::NodeRole::Detached:
26*e038c9c4Sjoerg return OS << "Detached";
27*e038c9c4Sjoerg case syntax::NodeRole::Unknown:
28*e038c9c4Sjoerg return OS << "Unknown";
29*e038c9c4Sjoerg case syntax::NodeRole::OpenParen:
30*e038c9c4Sjoerg return OS << "OpenParen";
31*e038c9c4Sjoerg case syntax::NodeRole::CloseParen:
32*e038c9c4Sjoerg return OS << "CloseParen";
33*e038c9c4Sjoerg case syntax::NodeRole::IntroducerKeyword:
34*e038c9c4Sjoerg return OS << "IntroducerKeyword";
35*e038c9c4Sjoerg case syntax::NodeRole::LiteralToken:
36*e038c9c4Sjoerg return OS << "LiteralToken";
37*e038c9c4Sjoerg case syntax::NodeRole::ArrowToken:
38*e038c9c4Sjoerg return OS << "ArrowToken";
39*e038c9c4Sjoerg case syntax::NodeRole::ExternKeyword:
40*e038c9c4Sjoerg return OS << "ExternKeyword";
41*e038c9c4Sjoerg case syntax::NodeRole::TemplateKeyword:
42*e038c9c4Sjoerg return OS << "TemplateKeyword";
43*e038c9c4Sjoerg case syntax::NodeRole::BodyStatement:
44*e038c9c4Sjoerg return OS << "BodyStatement";
45*e038c9c4Sjoerg case syntax::NodeRole::ListElement:
46*e038c9c4Sjoerg return OS << "ListElement";
47*e038c9c4Sjoerg case syntax::NodeRole::ListDelimiter:
48*e038c9c4Sjoerg return OS << "ListDelimiter";
49*e038c9c4Sjoerg case syntax::NodeRole::CaseValue:
50*e038c9c4Sjoerg return OS << "CaseValue";
51*e038c9c4Sjoerg case syntax::NodeRole::ReturnValue:
52*e038c9c4Sjoerg return OS << "ReturnValue";
53*e038c9c4Sjoerg case syntax::NodeRole::ThenStatement:
54*e038c9c4Sjoerg return OS << "ThenStatement";
55*e038c9c4Sjoerg case syntax::NodeRole::ElseKeyword:
56*e038c9c4Sjoerg return OS << "ElseKeyword";
57*e038c9c4Sjoerg case syntax::NodeRole::ElseStatement:
58*e038c9c4Sjoerg return OS << "ElseStatement";
59*e038c9c4Sjoerg case syntax::NodeRole::OperatorToken:
60*e038c9c4Sjoerg return OS << "OperatorToken";
61*e038c9c4Sjoerg case syntax::NodeRole::Operand:
62*e038c9c4Sjoerg return OS << "Operand";
63*e038c9c4Sjoerg case syntax::NodeRole::LeftHandSide:
64*e038c9c4Sjoerg return OS << "LeftHandSide";
65*e038c9c4Sjoerg case syntax::NodeRole::RightHandSide:
66*e038c9c4Sjoerg return OS << "RightHandSide";
67*e038c9c4Sjoerg case syntax::NodeRole::Expression:
68*e038c9c4Sjoerg return OS << "Expression";
69*e038c9c4Sjoerg case syntax::NodeRole::Statement:
70*e038c9c4Sjoerg return OS << "Statement";
71*e038c9c4Sjoerg case syntax::NodeRole::Condition:
72*e038c9c4Sjoerg return OS << "Condition";
73*e038c9c4Sjoerg case syntax::NodeRole::Message:
74*e038c9c4Sjoerg return OS << "Message";
75*e038c9c4Sjoerg case syntax::NodeRole::Declarator:
76*e038c9c4Sjoerg return OS << "Declarator";
77*e038c9c4Sjoerg case syntax::NodeRole::Declaration:
78*e038c9c4Sjoerg return OS << "Declaration";
79*e038c9c4Sjoerg case syntax::NodeRole::Size:
80*e038c9c4Sjoerg return OS << "Size";
81*e038c9c4Sjoerg case syntax::NodeRole::Parameters:
82*e038c9c4Sjoerg return OS << "Parameters";
83*e038c9c4Sjoerg case syntax::NodeRole::TrailingReturn:
84*e038c9c4Sjoerg return OS << "TrailingReturn";
85*e038c9c4Sjoerg case syntax::NodeRole::UnqualifiedId:
86*e038c9c4Sjoerg return OS << "UnqualifiedId";
87*e038c9c4Sjoerg case syntax::NodeRole::Qualifier:
88*e038c9c4Sjoerg return OS << "Qualifier";
89*e038c9c4Sjoerg case syntax::NodeRole::SubExpression:
90*e038c9c4Sjoerg return OS << "SubExpression";
91*e038c9c4Sjoerg case syntax::NodeRole::Object:
92*e038c9c4Sjoerg return OS << "Object";
93*e038c9c4Sjoerg case syntax::NodeRole::AccessToken:
94*e038c9c4Sjoerg return OS << "AccessToken";
95*e038c9c4Sjoerg case syntax::NodeRole::Member:
96*e038c9c4Sjoerg return OS << "Member";
97*e038c9c4Sjoerg case syntax::NodeRole::Callee:
98*e038c9c4Sjoerg return OS << "Callee";
99*e038c9c4Sjoerg case syntax::NodeRole::Arguments:
100*e038c9c4Sjoerg return OS << "Arguments";
101*e038c9c4Sjoerg case syntax::NodeRole::Declarators:
102*e038c9c4Sjoerg return OS << "Declarators";
103*e038c9c4Sjoerg }
104*e038c9c4Sjoerg llvm_unreachable("invalid role");
1057330f729Sjoerg }
1067330f729Sjoerg
107*e038c9c4Sjoerg // We could have an interator in list to not pay memory costs of temporary
108*e038c9c4Sjoerg // vector
109*e038c9c4Sjoerg std::vector<syntax::NameSpecifier *>
getSpecifiers()110*e038c9c4Sjoerg syntax::NestedNameSpecifier::getSpecifiers() {
111*e038c9c4Sjoerg auto SpecifiersAsNodes = getElementsAsNodes();
112*e038c9c4Sjoerg std::vector<syntax::NameSpecifier *> Children;
113*e038c9c4Sjoerg for (const auto &Element : SpecifiersAsNodes) {
114*e038c9c4Sjoerg Children.push_back(llvm::cast<syntax::NameSpecifier>(Element));
1157330f729Sjoerg }
116*e038c9c4Sjoerg return Children;
117*e038c9c4Sjoerg }
118*e038c9c4Sjoerg
119*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>
getSpecifiersAndDoubleColons()120*e038c9c4Sjoerg syntax::NestedNameSpecifier::getSpecifiersAndDoubleColons() {
121*e038c9c4Sjoerg auto SpecifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters();
122*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>
123*e038c9c4Sjoerg Children;
124*e038c9c4Sjoerg for (const auto &SpecifierAndDoubleColon : SpecifiersAsNodesAndDoubleColons) {
125*e038c9c4Sjoerg Children.push_back(
126*e038c9c4Sjoerg {llvm::cast<syntax::NameSpecifier>(SpecifierAndDoubleColon.element),
127*e038c9c4Sjoerg SpecifierAndDoubleColon.delimiter});
128*e038c9c4Sjoerg }
129*e038c9c4Sjoerg return Children;
130*e038c9c4Sjoerg }
131*e038c9c4Sjoerg
getArguments()132*e038c9c4Sjoerg std::vector<syntax::Expression *> syntax::CallArguments::getArguments() {
133*e038c9c4Sjoerg auto ArgumentsAsNodes = getElementsAsNodes();
134*e038c9c4Sjoerg std::vector<syntax::Expression *> Children;
135*e038c9c4Sjoerg for (const auto &ArgumentAsNode : ArgumentsAsNodes) {
136*e038c9c4Sjoerg Children.push_back(llvm::cast<syntax::Expression>(ArgumentAsNode));
137*e038c9c4Sjoerg }
138*e038c9c4Sjoerg return Children;
139*e038c9c4Sjoerg }
140*e038c9c4Sjoerg
141*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>>
getArgumentsAndCommas()142*e038c9c4Sjoerg syntax::CallArguments::getArgumentsAndCommas() {
143*e038c9c4Sjoerg auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters();
144*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> Children;
145*e038c9c4Sjoerg for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) {
146*e038c9c4Sjoerg Children.push_back(
147*e038c9c4Sjoerg {llvm::cast<syntax::Expression>(ArgumentAsNodeAndComma.element),
148*e038c9c4Sjoerg ArgumentAsNodeAndComma.delimiter});
149*e038c9c4Sjoerg }
150*e038c9c4Sjoerg return Children;
151*e038c9c4Sjoerg }
152*e038c9c4Sjoerg
153*e038c9c4Sjoerg std::vector<syntax::SimpleDeclaration *>
getParameterDeclarations()154*e038c9c4Sjoerg syntax::ParameterDeclarationList::getParameterDeclarations() {
155*e038c9c4Sjoerg auto ParametersAsNodes = getElementsAsNodes();
156*e038c9c4Sjoerg std::vector<syntax::SimpleDeclaration *> Children;
157*e038c9c4Sjoerg for (const auto &ParameterAsNode : ParametersAsNodes) {
158*e038c9c4Sjoerg Children.push_back(llvm::cast<syntax::SimpleDeclaration>(ParameterAsNode));
159*e038c9c4Sjoerg }
160*e038c9c4Sjoerg return Children;
161*e038c9c4Sjoerg }
162*e038c9c4Sjoerg
163*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>
getParametersAndCommas()164*e038c9c4Sjoerg syntax::ParameterDeclarationList::getParametersAndCommas() {
165*e038c9c4Sjoerg auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters();
166*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>
167*e038c9c4Sjoerg Children;
168*e038c9c4Sjoerg for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) {
169*e038c9c4Sjoerg Children.push_back(
170*e038c9c4Sjoerg {llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element),
171*e038c9c4Sjoerg ParameterAsNodeAndComma.delimiter});
172*e038c9c4Sjoerg }
173*e038c9c4Sjoerg return Children;
174*e038c9c4Sjoerg }
175*e038c9c4Sjoerg
176*e038c9c4Sjoerg std::vector<syntax::SimpleDeclarator *>
getDeclarators()177*e038c9c4Sjoerg syntax::DeclaratorList::getDeclarators() {
178*e038c9c4Sjoerg auto DeclaratorsAsNodes = getElementsAsNodes();
179*e038c9c4Sjoerg std::vector<syntax::SimpleDeclarator *> Children;
180*e038c9c4Sjoerg for (const auto &DeclaratorAsNode : DeclaratorsAsNodes) {
181*e038c9c4Sjoerg Children.push_back(llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNode));
182*e038c9c4Sjoerg }
183*e038c9c4Sjoerg return Children;
184*e038c9c4Sjoerg }
185*e038c9c4Sjoerg
186*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>
getDeclaratorsAndCommas()187*e038c9c4Sjoerg syntax::DeclaratorList::getDeclaratorsAndCommas() {
188*e038c9c4Sjoerg auto DeclaratorsAsNodesAndCommas = getElementsAsNodesAndDelimiters();
189*e038c9c4Sjoerg std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>
190*e038c9c4Sjoerg Children;
191*e038c9c4Sjoerg for (const auto &DeclaratorAsNodeAndComma : DeclaratorsAsNodesAndCommas) {
192*e038c9c4Sjoerg Children.push_back(
193*e038c9c4Sjoerg {llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNodeAndComma.element),
194*e038c9c4Sjoerg DeclaratorAsNodeAndComma.delimiter});
195*e038c9c4Sjoerg }
196*e038c9c4Sjoerg return Children;
197*e038c9c4Sjoerg }
198*e038c9c4Sjoerg
getLhs()199*e038c9c4Sjoerg syntax::Expression *syntax::BinaryOperatorExpression::getLhs() {
200*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
201*e038c9c4Sjoerg findChild(syntax::NodeRole::LeftHandSide));
202*e038c9c4Sjoerg }
203*e038c9c4Sjoerg
getOperatorToken()204*e038c9c4Sjoerg syntax::Leaf *syntax::UnaryOperatorExpression::getOperatorToken() {
205*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));
206*e038c9c4Sjoerg }
207*e038c9c4Sjoerg
getOperand()208*e038c9c4Sjoerg syntax::Expression *syntax::UnaryOperatorExpression::getOperand() {
209*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Operand));
210*e038c9c4Sjoerg }
211*e038c9c4Sjoerg
getOperatorToken()212*e038c9c4Sjoerg syntax::Leaf *syntax::BinaryOperatorExpression::getOperatorToken() {
213*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));
214*e038c9c4Sjoerg }
215*e038c9c4Sjoerg
getRhs()216*e038c9c4Sjoerg syntax::Expression *syntax::BinaryOperatorExpression::getRhs() {
217*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
218*e038c9c4Sjoerg findChild(syntax::NodeRole::RightHandSide));
219*e038c9c4Sjoerg }
220*e038c9c4Sjoerg
getSwitchKeyword()221*e038c9c4Sjoerg syntax::Leaf *syntax::SwitchStatement::getSwitchKeyword() {
222*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
223*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
224*e038c9c4Sjoerg }
225*e038c9c4Sjoerg
getBody()226*e038c9c4Sjoerg syntax::Statement *syntax::SwitchStatement::getBody() {
227*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
228*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
229*e038c9c4Sjoerg }
230*e038c9c4Sjoerg
getCaseKeyword()231*e038c9c4Sjoerg syntax::Leaf *syntax::CaseStatement::getCaseKeyword() {
232*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
233*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
234*e038c9c4Sjoerg }
235*e038c9c4Sjoerg
getCaseValue()236*e038c9c4Sjoerg syntax::Expression *syntax::CaseStatement::getCaseValue() {
237*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
238*e038c9c4Sjoerg findChild(syntax::NodeRole::CaseValue));
239*e038c9c4Sjoerg }
240*e038c9c4Sjoerg
getBody()241*e038c9c4Sjoerg syntax::Statement *syntax::CaseStatement::getBody() {
242*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
243*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
244*e038c9c4Sjoerg }
245*e038c9c4Sjoerg
getDefaultKeyword()246*e038c9c4Sjoerg syntax::Leaf *syntax::DefaultStatement::getDefaultKeyword() {
247*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
248*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
249*e038c9c4Sjoerg }
250*e038c9c4Sjoerg
getBody()251*e038c9c4Sjoerg syntax::Statement *syntax::DefaultStatement::getBody() {
252*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
253*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
254*e038c9c4Sjoerg }
255*e038c9c4Sjoerg
getIfKeyword()256*e038c9c4Sjoerg syntax::Leaf *syntax::IfStatement::getIfKeyword() {
257*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
258*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
259*e038c9c4Sjoerg }
260*e038c9c4Sjoerg
getThenStatement()261*e038c9c4Sjoerg syntax::Statement *syntax::IfStatement::getThenStatement() {
262*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
263*e038c9c4Sjoerg findChild(syntax::NodeRole::ThenStatement));
264*e038c9c4Sjoerg }
265*e038c9c4Sjoerg
getElseKeyword()266*e038c9c4Sjoerg syntax::Leaf *syntax::IfStatement::getElseKeyword() {
267*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ElseKeyword));
268*e038c9c4Sjoerg }
269*e038c9c4Sjoerg
getElseStatement()270*e038c9c4Sjoerg syntax::Statement *syntax::IfStatement::getElseStatement() {
271*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
272*e038c9c4Sjoerg findChild(syntax::NodeRole::ElseStatement));
273*e038c9c4Sjoerg }
274*e038c9c4Sjoerg
getForKeyword()275*e038c9c4Sjoerg syntax::Leaf *syntax::ForStatement::getForKeyword() {
276*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
277*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
278*e038c9c4Sjoerg }
279*e038c9c4Sjoerg
getBody()280*e038c9c4Sjoerg syntax::Statement *syntax::ForStatement::getBody() {
281*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
282*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
283*e038c9c4Sjoerg }
284*e038c9c4Sjoerg
getWhileKeyword()285*e038c9c4Sjoerg syntax::Leaf *syntax::WhileStatement::getWhileKeyword() {
286*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
287*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
288*e038c9c4Sjoerg }
289*e038c9c4Sjoerg
getBody()290*e038c9c4Sjoerg syntax::Statement *syntax::WhileStatement::getBody() {
291*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
292*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
293*e038c9c4Sjoerg }
294*e038c9c4Sjoerg
getContinueKeyword()295*e038c9c4Sjoerg syntax::Leaf *syntax::ContinueStatement::getContinueKeyword() {
296*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
297*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
298*e038c9c4Sjoerg }
299*e038c9c4Sjoerg
getBreakKeyword()300*e038c9c4Sjoerg syntax::Leaf *syntax::BreakStatement::getBreakKeyword() {
301*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
302*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
303*e038c9c4Sjoerg }
304*e038c9c4Sjoerg
getReturnKeyword()305*e038c9c4Sjoerg syntax::Leaf *syntax::ReturnStatement::getReturnKeyword() {
306*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
307*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
308*e038c9c4Sjoerg }
309*e038c9c4Sjoerg
getReturnValue()310*e038c9c4Sjoerg syntax::Expression *syntax::ReturnStatement::getReturnValue() {
311*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
312*e038c9c4Sjoerg findChild(syntax::NodeRole::ReturnValue));
313*e038c9c4Sjoerg }
314*e038c9c4Sjoerg
getForKeyword()315*e038c9c4Sjoerg syntax::Leaf *syntax::RangeBasedForStatement::getForKeyword() {
316*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
317*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
318*e038c9c4Sjoerg }
319*e038c9c4Sjoerg
getBody()320*e038c9c4Sjoerg syntax::Statement *syntax::RangeBasedForStatement::getBody() {
321*e038c9c4Sjoerg return cast_or_null<syntax::Statement>(
322*e038c9c4Sjoerg findChild(syntax::NodeRole::BodyStatement));
323*e038c9c4Sjoerg }
324*e038c9c4Sjoerg
getExpression()325*e038c9c4Sjoerg syntax::Expression *syntax::ExpressionStatement::getExpression() {
326*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
327*e038c9c4Sjoerg findChild(syntax::NodeRole::Expression));
328*e038c9c4Sjoerg }
329*e038c9c4Sjoerg
getLbrace()330*e038c9c4Sjoerg syntax::Leaf *syntax::CompoundStatement::getLbrace() {
331*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
332*e038c9c4Sjoerg }
333*e038c9c4Sjoerg
getStatements()334*e038c9c4Sjoerg std::vector<syntax::Statement *> syntax::CompoundStatement::getStatements() {
335*e038c9c4Sjoerg std::vector<syntax::Statement *> Children;
336*e038c9c4Sjoerg for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
337*e038c9c4Sjoerg assert(C->getRole() == syntax::NodeRole::Statement);
338*e038c9c4Sjoerg Children.push_back(cast<syntax::Statement>(C));
339*e038c9c4Sjoerg }
340*e038c9c4Sjoerg return Children;
341*e038c9c4Sjoerg }
342*e038c9c4Sjoerg
getRbrace()343*e038c9c4Sjoerg syntax::Leaf *syntax::CompoundStatement::getRbrace() {
344*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
345*e038c9c4Sjoerg }
346*e038c9c4Sjoerg
getCondition()347*e038c9c4Sjoerg syntax::Expression *syntax::StaticAssertDeclaration::getCondition() {
348*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(
349*e038c9c4Sjoerg findChild(syntax::NodeRole::Condition));
350*e038c9c4Sjoerg }
351*e038c9c4Sjoerg
getMessage()352*e038c9c4Sjoerg syntax::Expression *syntax::StaticAssertDeclaration::getMessage() {
353*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Message));
354*e038c9c4Sjoerg }
355*e038c9c4Sjoerg
356*e038c9c4Sjoerg std::vector<syntax::SimpleDeclarator *>
getDeclarators()357*e038c9c4Sjoerg syntax::SimpleDeclaration::getDeclarators() {
358*e038c9c4Sjoerg std::vector<syntax::SimpleDeclarator *> Children;
359*e038c9c4Sjoerg for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
360*e038c9c4Sjoerg if (C->getRole() == syntax::NodeRole::Declarator)
361*e038c9c4Sjoerg Children.push_back(cast<syntax::SimpleDeclarator>(C));
362*e038c9c4Sjoerg }
363*e038c9c4Sjoerg return Children;
364*e038c9c4Sjoerg }
365*e038c9c4Sjoerg
getTemplateKeyword()366*e038c9c4Sjoerg syntax::Leaf *syntax::TemplateDeclaration::getTemplateKeyword() {
367*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
368*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
369*e038c9c4Sjoerg }
370*e038c9c4Sjoerg
getDeclaration()371*e038c9c4Sjoerg syntax::Declaration *syntax::TemplateDeclaration::getDeclaration() {
372*e038c9c4Sjoerg return cast_or_null<syntax::Declaration>(
373*e038c9c4Sjoerg findChild(syntax::NodeRole::Declaration));
374*e038c9c4Sjoerg }
375*e038c9c4Sjoerg
getTemplateKeyword()376*e038c9c4Sjoerg syntax::Leaf *syntax::ExplicitTemplateInstantiation::getTemplateKeyword() {
377*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(
378*e038c9c4Sjoerg findChild(syntax::NodeRole::IntroducerKeyword));
379*e038c9c4Sjoerg }
380*e038c9c4Sjoerg
getExternKeyword()381*e038c9c4Sjoerg syntax::Leaf *syntax::ExplicitTemplateInstantiation::getExternKeyword() {
382*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ExternKeyword));
383*e038c9c4Sjoerg }
384*e038c9c4Sjoerg
getDeclaration()385*e038c9c4Sjoerg syntax::Declaration *syntax::ExplicitTemplateInstantiation::getDeclaration() {
386*e038c9c4Sjoerg return cast_or_null<syntax::Declaration>(
387*e038c9c4Sjoerg findChild(syntax::NodeRole::Declaration));
388*e038c9c4Sjoerg }
389*e038c9c4Sjoerg
getLparen()390*e038c9c4Sjoerg syntax::Leaf *syntax::ParenDeclarator::getLparen() {
391*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
392*e038c9c4Sjoerg }
393*e038c9c4Sjoerg
getRparen()394*e038c9c4Sjoerg syntax::Leaf *syntax::ParenDeclarator::getRparen() {
395*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
396*e038c9c4Sjoerg }
397*e038c9c4Sjoerg
getLbracket()398*e038c9c4Sjoerg syntax::Leaf *syntax::ArraySubscript::getLbracket() {
399*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
400*e038c9c4Sjoerg }
401*e038c9c4Sjoerg
getSize()402*e038c9c4Sjoerg syntax::Expression *syntax::ArraySubscript::getSize() {
403*e038c9c4Sjoerg return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Size));
404*e038c9c4Sjoerg }
405*e038c9c4Sjoerg
getRbracket()406*e038c9c4Sjoerg syntax::Leaf *syntax::ArraySubscript::getRbracket() {
407*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
408*e038c9c4Sjoerg }
409*e038c9c4Sjoerg
getArrowToken()410*e038c9c4Sjoerg syntax::Leaf *syntax::TrailingReturnType::getArrowToken() {
411*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ArrowToken));
412*e038c9c4Sjoerg }
413*e038c9c4Sjoerg
getDeclarator()414*e038c9c4Sjoerg syntax::SimpleDeclarator *syntax::TrailingReturnType::getDeclarator() {
415*e038c9c4Sjoerg return cast_or_null<syntax::SimpleDeclarator>(
416*e038c9c4Sjoerg findChild(syntax::NodeRole::Declarator));
417*e038c9c4Sjoerg }
418*e038c9c4Sjoerg
getLparen()419*e038c9c4Sjoerg syntax::Leaf *syntax::ParametersAndQualifiers::getLparen() {
420*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
421*e038c9c4Sjoerg }
422*e038c9c4Sjoerg
423*e038c9c4Sjoerg syntax::ParameterDeclarationList *
getParameters()424*e038c9c4Sjoerg syntax::ParametersAndQualifiers::getParameters() {
425*e038c9c4Sjoerg return cast_or_null<syntax::ParameterDeclarationList>(
426*e038c9c4Sjoerg findChild(syntax::NodeRole::Parameters));
427*e038c9c4Sjoerg }
428*e038c9c4Sjoerg
getRparen()429*e038c9c4Sjoerg syntax::Leaf *syntax::ParametersAndQualifiers::getRparen() {
430*e038c9c4Sjoerg return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
431*e038c9c4Sjoerg }
432*e038c9c4Sjoerg
433*e038c9c4Sjoerg syntax::TrailingReturnType *
getTrailingReturn()434*e038c9c4Sjoerg syntax::ParametersAndQualifiers::getTrailingReturn() {
435*e038c9c4Sjoerg return cast_or_null<syntax::TrailingReturnType>(
436*e038c9c4Sjoerg findChild(syntax::NodeRole::TrailingReturn));
437*e038c9c4Sjoerg }
438*e038c9c4Sjoerg
439*e038c9c4Sjoerg #define NODE(Kind, Parent) \
440*e038c9c4Sjoerg static_assert(sizeof(syntax::Kind) > 0, "Missing Node subclass definition");
441*e038c9c4Sjoerg #include "clang/Tooling/Syntax/Nodes.inc"
442