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