19b3f38f9SIlya Biryukov //===- Nodes.cpp ----------------------------------------------*- C++ -*-=====//
29b3f38f9SIlya Biryukov //
39b3f38f9SIlya Biryukov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49b3f38f9SIlya Biryukov // See https://llvm.org/LICENSE.txt for license information.
59b3f38f9SIlya Biryukov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69b3f38f9SIlya Biryukov //
79b3f38f9SIlya Biryukov //===----------------------------------------------------------------------===//
89b3f38f9SIlya Biryukov #include "clang/Tooling/Syntax/Nodes.h"
9*5b8337cfSHaojian Wu #include "llvm/Support/raw_ostream.h"
109b3f38f9SIlya Biryukov
119b3f38f9SIlya Biryukov using namespace clang;
129b3f38f9SIlya Biryukov
operator <<(raw_ostream & OS,NodeKind K)13ba41a0f7SEduardo Caldas raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) {
149b3f38f9SIlya Biryukov switch (K) {
15138189eeSSam McCall #define CONCRETE_NODE(Kind, Parent) \
16138189eeSSam McCall case NodeKind::Kind: \
17138189eeSSam McCall return OS << #Kind;
18138189eeSSam McCall #include "clang/Tooling/Syntax/Nodes.inc"
199b3f38f9SIlya Biryukov }
209b3f38f9SIlya Biryukov llvm_unreachable("unknown node kind");
219b3f38f9SIlya Biryukov }
229b3f38f9SIlya Biryukov
operator <<(raw_ostream & OS,NodeRole R)23ba41a0f7SEduardo Caldas raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) {
2458fa50f4SIlya Biryukov switch (R) {
2558fa50f4SIlya Biryukov case syntax::NodeRole::Detached:
2658fa50f4SIlya Biryukov return OS << "Detached";
2758fa50f4SIlya Biryukov case syntax::NodeRole::Unknown:
2858fa50f4SIlya Biryukov return OS << "Unknown";
2958fa50f4SIlya Biryukov case syntax::NodeRole::OpenParen:
3058fa50f4SIlya Biryukov return OS << "OpenParen";
3158fa50f4SIlya Biryukov case syntax::NodeRole::CloseParen:
3258fa50f4SIlya Biryukov return OS << "CloseParen";
3358fa50f4SIlya Biryukov case syntax::NodeRole::IntroducerKeyword:
3458fa50f4SIlya Biryukov return OS << "IntroducerKeyword";
3542f6fec3SEduardo Caldas case syntax::NodeRole::LiteralToken:
3642f6fec3SEduardo Caldas return OS << "LiteralToken";
3742f6fec3SEduardo Caldas case syntax::NodeRole::ArrowToken:
3842f6fec3SEduardo Caldas return OS << "ArrowToken";
3942f6fec3SEduardo Caldas case syntax::NodeRole::ExternKeyword:
4042f6fec3SEduardo Caldas return OS << "ExternKeyword";
418abb5fb6SEduardo Caldas case syntax::NodeRole::TemplateKeyword:
428abb5fb6SEduardo Caldas return OS << "TemplateKeyword";
4358fa50f4SIlya Biryukov case syntax::NodeRole::BodyStatement:
4458fa50f4SIlya Biryukov return OS << "BodyStatement";
45718e550cSEduardo Caldas case syntax::NodeRole::ListElement:
46718e550cSEduardo Caldas return OS << "ListElement";
47718e550cSEduardo Caldas case syntax::NodeRole::ListDelimiter:
48718e550cSEduardo Caldas return OS << "ListDelimiter";
49718e550cSEduardo Caldas case syntax::NodeRole::CaseValue:
50718e550cSEduardo Caldas return OS << "CaseValue";
51718e550cSEduardo Caldas case syntax::NodeRole::ReturnValue:
52718e550cSEduardo Caldas return OS << "ReturnValue";
53718e550cSEduardo Caldas case syntax::NodeRole::ThenStatement:
54718e550cSEduardo Caldas return OS << "ThenStatement";
55718e550cSEduardo Caldas case syntax::NodeRole::ElseKeyword:
56718e550cSEduardo Caldas return OS << "ElseKeyword";
57718e550cSEduardo Caldas case syntax::NodeRole::ElseStatement:
58718e550cSEduardo Caldas return OS << "ElseStatement";
59718e550cSEduardo Caldas case syntax::NodeRole::OperatorToken:
60718e550cSEduardo Caldas return OS << "OperatorToken";
61718e550cSEduardo Caldas case syntax::NodeRole::Operand:
62718e550cSEduardo Caldas return OS << "Operand";
63718e550cSEduardo Caldas case syntax::NodeRole::LeftHandSide:
64718e550cSEduardo Caldas return OS << "LeftHandSide";
65718e550cSEduardo Caldas case syntax::NodeRole::RightHandSide:
66718e550cSEduardo Caldas return OS << "RightHandSide";
67718e550cSEduardo Caldas case syntax::NodeRole::Expression:
68718e550cSEduardo Caldas return OS << "Expression";
69718e550cSEduardo Caldas case syntax::NodeRole::Statement:
70718e550cSEduardo Caldas return OS << "Statement";
71718e550cSEduardo Caldas case syntax::NodeRole::Condition:
72718e550cSEduardo Caldas return OS << "Condition";
73718e550cSEduardo Caldas case syntax::NodeRole::Message:
74718e550cSEduardo Caldas return OS << "Message";
75718e550cSEduardo Caldas case syntax::NodeRole::Declarator:
76718e550cSEduardo Caldas return OS << "Declarator";
77718e550cSEduardo Caldas case syntax::NodeRole::Declaration:
78718e550cSEduardo Caldas return OS << "Declaration";
79718e550cSEduardo Caldas case syntax::NodeRole::Size:
80718e550cSEduardo Caldas return OS << "Size";
81718e550cSEduardo Caldas case syntax::NodeRole::Parameters:
82718e550cSEduardo Caldas return OS << "Parameters";
83718e550cSEduardo Caldas case syntax::NodeRole::TrailingReturn:
84718e550cSEduardo Caldas return OS << "TrailingReturn";
85718e550cSEduardo Caldas case syntax::NodeRole::UnqualifiedId:
86718e550cSEduardo Caldas return OS << "UnqualifiedId";
87718e550cSEduardo Caldas case syntax::NodeRole::Qualifier:
88718e550cSEduardo Caldas return OS << "Qualifier";
89718e550cSEduardo Caldas case syntax::NodeRole::SubExpression:
90718e550cSEduardo Caldas return OS << "SubExpression";
91718e550cSEduardo Caldas case syntax::NodeRole::Object:
92718e550cSEduardo Caldas return OS << "Object";
93718e550cSEduardo Caldas case syntax::NodeRole::AccessToken:
94718e550cSEduardo Caldas return OS << "AccessToken";
95718e550cSEduardo Caldas case syntax::NodeRole::Member:
96718e550cSEduardo Caldas return OS << "Member";
97718e550cSEduardo Caldas case syntax::NodeRole::Callee:
98718e550cSEduardo Caldas return OS << "Callee";
99718e550cSEduardo Caldas case syntax::NodeRole::Arguments:
100718e550cSEduardo Caldas return OS << "Arguments";
1015011d431SEduardo Caldas case syntax::NodeRole::Declarators:
1025011d431SEduardo Caldas return OS << "Declarators";
10358fa50f4SIlya Biryukov }
10458fa50f4SIlya Biryukov llvm_unreachable("invalid role");
10558fa50f4SIlya Biryukov }
10658fa50f4SIlya Biryukov
107fdbd5996SEduardo Caldas // We could have an interator in list to not pay memory costs of temporary
108fdbd5996SEduardo Caldas // vector
109fda3fa82SEduardo Caldas std::vector<syntax::NameSpecifier *>
getSpecifiers()110fda3fa82SEduardo Caldas syntax::NestedNameSpecifier::getSpecifiers() {
11187f0b51dSEduardo Caldas auto SpecifiersAsNodes = getElementsAsNodes();
112fdbd5996SEduardo Caldas std::vector<syntax::NameSpecifier *> Children;
11387f0b51dSEduardo Caldas for (const auto &Element : SpecifiersAsNodes) {
11487f0b51dSEduardo Caldas Children.push_back(llvm::cast<syntax::NameSpecifier>(Element));
1158abb5fb6SEduardo Caldas }
1168abb5fb6SEduardo Caldas return Children;
1178abb5fb6SEduardo Caldas }
1188abb5fb6SEduardo Caldas
119fdbd5996SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>
getSpecifiersAndDoubleColons()120fda3fa82SEduardo Caldas syntax::NestedNameSpecifier::getSpecifiersAndDoubleColons() {
12187f0b51dSEduardo Caldas auto SpecifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters();
122fdbd5996SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>
123fdbd5996SEduardo Caldas Children;
12487f0b51dSEduardo Caldas for (const auto &SpecifierAndDoubleColon : SpecifiersAsNodesAndDoubleColons) {
125fdbd5996SEduardo Caldas Children.push_back(
12687f0b51dSEduardo Caldas {llvm::cast<syntax::NameSpecifier>(SpecifierAndDoubleColon.element),
12787f0b51dSEduardo Caldas SpecifierAndDoubleColon.delimiter});
1281b2f6b4aSEduardo Caldas }
1291b2f6b4aSEduardo Caldas return Children;
1301b2f6b4aSEduardo Caldas }
1311b2f6b4aSEduardo Caldas
getArguments()132fda3fa82SEduardo Caldas std::vector<syntax::Expression *> syntax::CallArguments::getArguments() {
1332de2ca34SEduardo Caldas auto ArgumentsAsNodes = getElementsAsNodes();
1342de2ca34SEduardo Caldas std::vector<syntax::Expression *> Children;
1352de2ca34SEduardo Caldas for (const auto &ArgumentAsNode : ArgumentsAsNodes) {
1362de2ca34SEduardo Caldas Children.push_back(llvm::cast<syntax::Expression>(ArgumentAsNode));
1372de2ca34SEduardo Caldas }
1382de2ca34SEduardo Caldas return Children;
1392de2ca34SEduardo Caldas }
1402de2ca34SEduardo Caldas
1412de2ca34SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>>
getArgumentsAndCommas()142fda3fa82SEduardo Caldas syntax::CallArguments::getArgumentsAndCommas() {
1432de2ca34SEduardo Caldas auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters();
1442de2ca34SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> Children;
1452de2ca34SEduardo Caldas for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) {
1462de2ca34SEduardo Caldas Children.push_back(
1472de2ca34SEduardo Caldas {llvm::cast<syntax::Expression>(ArgumentAsNodeAndComma.element),
1482de2ca34SEduardo Caldas ArgumentAsNodeAndComma.delimiter});
1492de2ca34SEduardo Caldas }
1502de2ca34SEduardo Caldas return Children;
1512de2ca34SEduardo Caldas }
1522de2ca34SEduardo Caldas
153dc3d4743SEduardo Caldas std::vector<syntax::SimpleDeclaration *>
getParameterDeclarations()154fda3fa82SEduardo Caldas syntax::ParameterDeclarationList::getParameterDeclarations() {
155dc3d4743SEduardo Caldas auto ParametersAsNodes = getElementsAsNodes();
156dc3d4743SEduardo Caldas std::vector<syntax::SimpleDeclaration *> Children;
157dc3d4743SEduardo Caldas for (const auto &ParameterAsNode : ParametersAsNodes) {
158dc3d4743SEduardo Caldas Children.push_back(llvm::cast<syntax::SimpleDeclaration>(ParameterAsNode));
159dc3d4743SEduardo Caldas }
160dc3d4743SEduardo Caldas return Children;
161dc3d4743SEduardo Caldas }
162dc3d4743SEduardo Caldas
163dc3d4743SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>
getParametersAndCommas()164fda3fa82SEduardo Caldas syntax::ParameterDeclarationList::getParametersAndCommas() {
165dc3d4743SEduardo Caldas auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters();
166dc3d4743SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>
167dc3d4743SEduardo Caldas Children;
168dc3d4743SEduardo Caldas for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) {
169dc3d4743SEduardo Caldas Children.push_back(
170dc3d4743SEduardo Caldas {llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element),
171dc3d4743SEduardo Caldas ParameterAsNodeAndComma.delimiter});
172dc3d4743SEduardo Caldas }
173dc3d4743SEduardo Caldas return Children;
174dc3d4743SEduardo Caldas }
175dc3d4743SEduardo Caldas
1765011d431SEduardo Caldas std::vector<syntax::SimpleDeclarator *>
getDeclarators()1775011d431SEduardo Caldas syntax::DeclaratorList::getDeclarators() {
1785011d431SEduardo Caldas auto DeclaratorsAsNodes = getElementsAsNodes();
1795011d431SEduardo Caldas std::vector<syntax::SimpleDeclarator *> Children;
1805011d431SEduardo Caldas for (const auto &DeclaratorAsNode : DeclaratorsAsNodes) {
1815011d431SEduardo Caldas Children.push_back(llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNode));
1825011d431SEduardo Caldas }
1835011d431SEduardo Caldas return Children;
1845011d431SEduardo Caldas }
1855011d431SEduardo Caldas
1865011d431SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>
getDeclaratorsAndCommas()1875011d431SEduardo Caldas syntax::DeclaratorList::getDeclaratorsAndCommas() {
1885011d431SEduardo Caldas auto DeclaratorsAsNodesAndCommas = getElementsAsNodesAndDelimiters();
1895011d431SEduardo Caldas std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>
1905011d431SEduardo Caldas Children;
1915011d431SEduardo Caldas for (const auto &DeclaratorAsNodeAndComma : DeclaratorsAsNodesAndCommas) {
1925011d431SEduardo Caldas Children.push_back(
1935011d431SEduardo Caldas {llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNodeAndComma.element),
1945011d431SEduardo Caldas DeclaratorAsNodeAndComma.delimiter});
1955011d431SEduardo Caldas }
1965011d431SEduardo Caldas return Children;
1975011d431SEduardo Caldas }
1985011d431SEduardo Caldas
getLhs()199fda3fa82SEduardo Caldas syntax::Expression *syntax::BinaryOperatorExpression::getLhs() {
200ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
201718e550cSEduardo Caldas findChild(syntax::NodeRole::LeftHandSide));
2023785eb83SEduardo Caldas }
2033785eb83SEduardo Caldas
getOperatorToken()204fda3fa82SEduardo Caldas syntax::Leaf *syntax::UnaryOperatorExpression::getOperatorToken() {
205718e550cSEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));
206461af57dSEduardo Caldas }
207461af57dSEduardo Caldas
getOperand()208fda3fa82SEduardo Caldas syntax::Expression *syntax::UnaryOperatorExpression::getOperand() {
209718e550cSEduardo Caldas return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Operand));
210461af57dSEduardo Caldas }
211461af57dSEduardo Caldas
getOperatorToken()212fda3fa82SEduardo Caldas syntax::Leaf *syntax::BinaryOperatorExpression::getOperatorToken() {
213718e550cSEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));
2143785eb83SEduardo Caldas }
2153785eb83SEduardo Caldas
getRhs()216fda3fa82SEduardo Caldas syntax::Expression *syntax::BinaryOperatorExpression::getRhs() {
217ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
218718e550cSEduardo Caldas findChild(syntax::NodeRole::RightHandSide));
2193785eb83SEduardo Caldas }
2203785eb83SEduardo Caldas
getSwitchKeyword()221fda3fa82SEduardo Caldas syntax::Leaf *syntax::SwitchStatement::getSwitchKeyword() {
222ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
22358fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
22458fa50f4SIlya Biryukov }
22558fa50f4SIlya Biryukov
getBody()226fda3fa82SEduardo Caldas syntax::Statement *syntax::SwitchStatement::getBody() {
227ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
22858fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
22958fa50f4SIlya Biryukov }
23058fa50f4SIlya Biryukov
getCaseKeyword()231fda3fa82SEduardo Caldas syntax::Leaf *syntax::CaseStatement::getCaseKeyword() {
232ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
23358fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
23458fa50f4SIlya Biryukov }
23558fa50f4SIlya Biryukov
getCaseValue()236fda3fa82SEduardo Caldas syntax::Expression *syntax::CaseStatement::getCaseValue() {
237ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
238718e550cSEduardo Caldas findChild(syntax::NodeRole::CaseValue));
23958fa50f4SIlya Biryukov }
24058fa50f4SIlya Biryukov
getBody()241fda3fa82SEduardo Caldas syntax::Statement *syntax::CaseStatement::getBody() {
242ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
24358fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
24458fa50f4SIlya Biryukov }
24558fa50f4SIlya Biryukov
getDefaultKeyword()246fda3fa82SEduardo Caldas syntax::Leaf *syntax::DefaultStatement::getDefaultKeyword() {
247ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
24858fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
24958fa50f4SIlya Biryukov }
25058fa50f4SIlya Biryukov
getBody()251fda3fa82SEduardo Caldas syntax::Statement *syntax::DefaultStatement::getBody() {
252ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
25358fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
25458fa50f4SIlya Biryukov }
25558fa50f4SIlya Biryukov
getIfKeyword()256fda3fa82SEduardo Caldas syntax::Leaf *syntax::IfStatement::getIfKeyword() {
257ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
25858fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
25958fa50f4SIlya Biryukov }
26058fa50f4SIlya Biryukov
getThenStatement()261fda3fa82SEduardo Caldas syntax::Statement *syntax::IfStatement::getThenStatement() {
262ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
263718e550cSEduardo Caldas findChild(syntax::NodeRole::ThenStatement));
26458fa50f4SIlya Biryukov }
26558fa50f4SIlya Biryukov
getElseKeyword()266fda3fa82SEduardo Caldas syntax::Leaf *syntax::IfStatement::getElseKeyword() {
267718e550cSEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ElseKeyword));
26858fa50f4SIlya Biryukov }
26958fa50f4SIlya Biryukov
getElseStatement()270fda3fa82SEduardo Caldas syntax::Statement *syntax::IfStatement::getElseStatement() {
271ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
272718e550cSEduardo Caldas findChild(syntax::NodeRole::ElseStatement));
27358fa50f4SIlya Biryukov }
27458fa50f4SIlya Biryukov
getForKeyword()275fda3fa82SEduardo Caldas syntax::Leaf *syntax::ForStatement::getForKeyword() {
276ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
27758fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
27858fa50f4SIlya Biryukov }
27958fa50f4SIlya Biryukov
getBody()280fda3fa82SEduardo Caldas syntax::Statement *syntax::ForStatement::getBody() {
281ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
28258fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
28358fa50f4SIlya Biryukov }
28458fa50f4SIlya Biryukov
getWhileKeyword()285fda3fa82SEduardo Caldas syntax::Leaf *syntax::WhileStatement::getWhileKeyword() {
286ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
28758fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
28858fa50f4SIlya Biryukov }
28958fa50f4SIlya Biryukov
getBody()290fda3fa82SEduardo Caldas syntax::Statement *syntax::WhileStatement::getBody() {
291ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
29258fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
29358fa50f4SIlya Biryukov }
29458fa50f4SIlya Biryukov
getContinueKeyword()295fda3fa82SEduardo Caldas syntax::Leaf *syntax::ContinueStatement::getContinueKeyword() {
296ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
29758fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
29858fa50f4SIlya Biryukov }
29958fa50f4SIlya Biryukov
getBreakKeyword()300fda3fa82SEduardo Caldas syntax::Leaf *syntax::BreakStatement::getBreakKeyword() {
301ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
30258fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
30358fa50f4SIlya Biryukov }
30458fa50f4SIlya Biryukov
getReturnKeyword()305fda3fa82SEduardo Caldas syntax::Leaf *syntax::ReturnStatement::getReturnKeyword() {
306ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
30758fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
30858fa50f4SIlya Biryukov }
30958fa50f4SIlya Biryukov
getReturnValue()310fda3fa82SEduardo Caldas syntax::Expression *syntax::ReturnStatement::getReturnValue() {
311ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
312718e550cSEduardo Caldas findChild(syntax::NodeRole::ReturnValue));
31358fa50f4SIlya Biryukov }
31458fa50f4SIlya Biryukov
getForKeyword()315fda3fa82SEduardo Caldas syntax::Leaf *syntax::RangeBasedForStatement::getForKeyword() {
316ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
31758fa50f4SIlya Biryukov findChild(syntax::NodeRole::IntroducerKeyword));
31858fa50f4SIlya Biryukov }
31958fa50f4SIlya Biryukov
getBody()320fda3fa82SEduardo Caldas syntax::Statement *syntax::RangeBasedForStatement::getBody() {
321ba41a0f7SEduardo Caldas return cast_or_null<syntax::Statement>(
32258fa50f4SIlya Biryukov findChild(syntax::NodeRole::BodyStatement));
32358fa50f4SIlya Biryukov }
32458fa50f4SIlya Biryukov
getExpression()325fda3fa82SEduardo Caldas syntax::Expression *syntax::ExpressionStatement::getExpression() {
326ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
327718e550cSEduardo Caldas findChild(syntax::NodeRole::Expression));
32858fa50f4SIlya Biryukov }
32958fa50f4SIlya Biryukov
getLbrace()330fda3fa82SEduardo Caldas syntax::Leaf *syntax::CompoundStatement::getLbrace() {
331ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
33258fa50f4SIlya Biryukov }
33358fa50f4SIlya Biryukov
getStatements()334fda3fa82SEduardo Caldas std::vector<syntax::Statement *> syntax::CompoundStatement::getStatements() {
33558fa50f4SIlya Biryukov std::vector<syntax::Statement *> Children;
3364c14ee61SEduardo Caldas for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
3374c14ee61SEduardo Caldas assert(C->getRole() == syntax::NodeRole::Statement);
338ba41a0f7SEduardo Caldas Children.push_back(cast<syntax::Statement>(C));
33958fa50f4SIlya Biryukov }
34058fa50f4SIlya Biryukov return Children;
3419b3f38f9SIlya Biryukov }
3429b3f38f9SIlya Biryukov
getRbrace()343fda3fa82SEduardo Caldas syntax::Leaf *syntax::CompoundStatement::getRbrace() {
344ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
3459b3f38f9SIlya Biryukov }
346be14a22bSIlya Biryukov
getCondition()347fda3fa82SEduardo Caldas syntax::Expression *syntax::StaticAssertDeclaration::getCondition() {
348ba41a0f7SEduardo Caldas return cast_or_null<syntax::Expression>(
349718e550cSEduardo Caldas findChild(syntax::NodeRole::Condition));
350be14a22bSIlya Biryukov }
351be14a22bSIlya Biryukov
getMessage()352fda3fa82SEduardo Caldas syntax::Expression *syntax::StaticAssertDeclaration::getMessage() {
353718e550cSEduardo Caldas return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Message));
354be14a22bSIlya Biryukov }
3557d382dcdSMarcel Hlopko
3567d382dcdSMarcel Hlopko std::vector<syntax::SimpleDeclarator *>
getDeclarators()357fda3fa82SEduardo Caldas syntax::SimpleDeclaration::getDeclarators() {
3587d382dcdSMarcel Hlopko std::vector<syntax::SimpleDeclarator *> Children;
3594c14ee61SEduardo Caldas for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
3604c14ee61SEduardo Caldas if (C->getRole() == syntax::NodeRole::Declarator)
361ba41a0f7SEduardo Caldas Children.push_back(cast<syntax::SimpleDeclarator>(C));
3627d382dcdSMarcel Hlopko }
3637d382dcdSMarcel Hlopko return Children;
3647d382dcdSMarcel Hlopko }
3657d382dcdSMarcel Hlopko
getTemplateKeyword()366fda3fa82SEduardo Caldas syntax::Leaf *syntax::TemplateDeclaration::getTemplateKeyword() {
367ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
36888bf9b3dSMarcel Hlopko findChild(syntax::NodeRole::IntroducerKeyword));
36988bf9b3dSMarcel Hlopko }
37088bf9b3dSMarcel Hlopko
getDeclaration()371fda3fa82SEduardo Caldas syntax::Declaration *syntax::TemplateDeclaration::getDeclaration() {
372ba41a0f7SEduardo Caldas return cast_or_null<syntax::Declaration>(
373718e550cSEduardo Caldas findChild(syntax::NodeRole::Declaration));
37488bf9b3dSMarcel Hlopko }
37588bf9b3dSMarcel Hlopko
getTemplateKeyword()376fda3fa82SEduardo Caldas syntax::Leaf *syntax::ExplicitTemplateInstantiation::getTemplateKeyword() {
377ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(
37888bf9b3dSMarcel Hlopko findChild(syntax::NodeRole::IntroducerKeyword));
37988bf9b3dSMarcel Hlopko }
38088bf9b3dSMarcel Hlopko
getExternKeyword()381fda3fa82SEduardo Caldas syntax::Leaf *syntax::ExplicitTemplateInstantiation::getExternKeyword() {
382ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ExternKeyword));
38388bf9b3dSMarcel Hlopko }
38488bf9b3dSMarcel Hlopko
getDeclaration()385fda3fa82SEduardo Caldas syntax::Declaration *syntax::ExplicitTemplateInstantiation::getDeclaration() {
386ba41a0f7SEduardo Caldas return cast_or_null<syntax::Declaration>(
387718e550cSEduardo Caldas findChild(syntax::NodeRole::Declaration));
38888bf9b3dSMarcel Hlopko }
38988bf9b3dSMarcel Hlopko
getLparen()390fda3fa82SEduardo Caldas syntax::Leaf *syntax::ParenDeclarator::getLparen() {
391ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
3927d382dcdSMarcel Hlopko }
3937d382dcdSMarcel Hlopko
getRparen()394fda3fa82SEduardo Caldas syntax::Leaf *syntax::ParenDeclarator::getRparen() {
395ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
3967d382dcdSMarcel Hlopko }
3977d382dcdSMarcel Hlopko
getLbracket()398fda3fa82SEduardo Caldas syntax::Leaf *syntax::ArraySubscript::getLbracket() {
399ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
4007d382dcdSMarcel Hlopko }
4017d382dcdSMarcel Hlopko
getSize()402fda3fa82SEduardo Caldas syntax::Expression *syntax::ArraySubscript::getSize() {
403718e550cSEduardo Caldas return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Size));
4047d382dcdSMarcel Hlopko }
4057d382dcdSMarcel Hlopko
getRbracket()406fda3fa82SEduardo Caldas syntax::Leaf *syntax::ArraySubscript::getRbracket() {
407ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
4087d382dcdSMarcel Hlopko }
4097d382dcdSMarcel Hlopko
getArrowToken()410fda3fa82SEduardo Caldas syntax::Leaf *syntax::TrailingReturnType::getArrowToken() {
411ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ArrowToken));
4127d382dcdSMarcel Hlopko }
4137d382dcdSMarcel Hlopko
getDeclarator()414fda3fa82SEduardo Caldas syntax::SimpleDeclarator *syntax::TrailingReturnType::getDeclarator() {
415ba41a0f7SEduardo Caldas return cast_or_null<syntax::SimpleDeclarator>(
416718e550cSEduardo Caldas findChild(syntax::NodeRole::Declarator));
4177d382dcdSMarcel Hlopko }
4187d382dcdSMarcel Hlopko
getLparen()419fda3fa82SEduardo Caldas syntax::Leaf *syntax::ParametersAndQualifiers::getLparen() {
420ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));
4217d382dcdSMarcel Hlopko }
4227d382dcdSMarcel Hlopko
423dc3d4743SEduardo Caldas syntax::ParameterDeclarationList *
getParameters()424fda3fa82SEduardo Caldas syntax::ParametersAndQualifiers::getParameters() {
425dc3d4743SEduardo Caldas return cast_or_null<syntax::ParameterDeclarationList>(
426718e550cSEduardo Caldas findChild(syntax::NodeRole::Parameters));
4277d382dcdSMarcel Hlopko }
4287d382dcdSMarcel Hlopko
getRparen()429fda3fa82SEduardo Caldas syntax::Leaf *syntax::ParametersAndQualifiers::getRparen() {
430ba41a0f7SEduardo Caldas return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));
4317d382dcdSMarcel Hlopko }
4327d382dcdSMarcel Hlopko
433fda3fa82SEduardo Caldas syntax::TrailingReturnType *
getTrailingReturn()434fda3fa82SEduardo Caldas syntax::ParametersAndQualifiers::getTrailingReturn() {
435ba41a0f7SEduardo Caldas return cast_or_null<syntax::TrailingReturnType>(
436718e550cSEduardo Caldas findChild(syntax::NodeRole::TrailingReturn));
4377d382dcdSMarcel Hlopko }
438454579e4SSam McCall
439454579e4SSam McCall #define NODE(Kind, Parent) \
440454579e4SSam McCall static_assert(sizeof(syntax::Kind) > 0, "Missing Node subclass definition");
441454579e4SSam McCall #include "clang/Tooling/Syntax/Nodes.inc"
442