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