clang 22.0.0git
Nodes.cpp
Go to the documentation of this file.
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//===----------------------------------------------------------------------===//
9#include "llvm/Support/raw_ostream.h"
10
11using namespace clang;
12
13raw_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
23raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) {
24 switch (R) {
26 return OS << "Detached";
28 return OS << "Unknown";
30 return OS << "OpenParen";
32 return OS << "CloseParen";
34 return OS << "IntroducerKeyword";
36 return OS << "LiteralToken";
38 return OS << "ArrowToken";
40 return OS << "ExternKeyword";
42 return OS << "TemplateKeyword";
44 return OS << "BodyStatement";
46 return OS << "ListElement";
48 return OS << "ListDelimiter";
50 return OS << "CaseValue";
52 return OS << "ReturnValue";
54 return OS << "ThenStatement";
56 return OS << "ElseKeyword";
58 return OS << "ElseStatement";
60 return OS << "OperatorToken";
62 return OS << "Operand";
64 return OS << "LeftHandSide";
66 return OS << "RightHandSide";
68 return OS << "Expression";
70 return OS << "Statement";
72 return OS << "Condition";
74 return OS << "Message";
76 return OS << "Declarator";
78 return OS << "Declaration";
80 return OS << "Size";
82 return OS << "Parameters";
84 return OS << "TrailingReturn";
86 return OS << "UnqualifiedId";
88 return OS << "Qualifier";
90 return OS << "SubExpression";
92 return OS << "Object";
94 return OS << "AccessToken";
96 return OS << "Member";
98 return OS << "Callee";
100 return OS << "Arguments";
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
109std::vector<syntax::NameSpecifier *>
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
119std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>
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
132std::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
141std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>>
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
153std::vector<syntax::SimpleDeclaration *>
155 auto ParametersAsNodes = getElementsAsNodes();
156 std::vector<syntax::SimpleDeclaration *> Children;
157 for (const auto &ParameterAsNode : ParametersAsNodes) {
158 Children.push_back(llvm::cast<syntax::SimpleDeclaration>(ParameterAsNode));
159 }
160 return Children;
161}
162
163std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>
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 {llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element),
171 ParameterAsNodeAndComma.delimiter});
172 }
173 return Children;
174}
175
176std::vector<syntax::SimpleDeclarator *>
178 auto DeclaratorsAsNodes = getElementsAsNodes();
179 std::vector<syntax::SimpleDeclarator *> Children;
180 for (const auto &DeclaratorAsNode : DeclaratorsAsNodes) {
181 Children.push_back(llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNode));
182 }
183 return Children;
184}
185
186std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>
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 {llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNodeAndComma.element),
194 DeclaratorAsNodeAndComma.delimiter});
195 }
196 return Children;
197}
198
200 return cast_or_null<syntax::Expression>(
202}
203
205 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));
206}
207
209 return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Operand));
210}
211
215
217 return cast_or_null<syntax::Expression>(
219}
220
225
227 return cast_or_null<syntax::Statement>(
229}
230
235
237 return cast_or_null<syntax::Expression>(
239}
240
242 return cast_or_null<syntax::Statement>(
244}
245
250
252 return cast_or_null<syntax::Statement>(
254}
255
260
265
269
274
279
281 return cast_or_null<syntax::Statement>(
283}
284
289
291 return cast_or_null<syntax::Statement>(
293}
294
299
304
309
311 return cast_or_null<syntax::Expression>(
313}
314
319
324
329
333
334std::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);
339 }
340 return Children;
341}
342
346
351
355
356std::vector<syntax::SimpleDeclarator *>
358 std::vector<syntax::SimpleDeclarator *> Children;
359 for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {
360 if (C->getRole() == syntax::NodeRole::Declarator)
362 }
363 return Children;
364}
365
370
375
380
384
389
393
397
401
403 return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Size));
404}
405
409
413
415 return cast_or_null<syntax::SimpleDeclarator>(
417}
418
422
425 return cast_or_null<syntax::ParameterDeclarationList>(
427}
428
432
435 return cast_or_null<syntax::TrailingReturnType>(
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"
SmallVector< AnnotatedLine *, 1 > Children
If this token starts a block, this contains all the unwrapped lines in it.
std::vector< List::ElementAndDelimiter< Expression > > getArgumentsAndCommas()
Definition Nodes.cpp:142
std::vector< Expression * > getArguments()
Definition Nodes.cpp:132
Expression * getCaseValue()
Definition Nodes.cpp:236
std::vector< Statement * > getStatements()
FIXME: use custom iterator instead of 'vector'.
Definition Nodes.cpp:334
A declaration that can appear at the top-level.
Definition Nodes.h:354
std::vector< SimpleDeclarator * > getDeclarators()
Definition Nodes.cpp:177
std::vector< List::ElementAndDelimiter< syntax::SimpleDeclarator > > getDeclaratorsAndCommas()
Definition Nodes.cpp:187
Statement * getThenStatement()
Definition Nodes.cpp:261
Statement * getElseStatement()
Definition Nodes.cpp:270
A leaf node points to a single token.
Definition Tree.h:132
std::vector< Node * > getElementsAsNodes()
Returns the elements of the list.
Definition Tree.cpp:356
std::vector< ElementAndDelimiter< Node > > getElementsAsNodesAndDelimiters()
Returns the elements and corresponding delimiters.
Definition Tree.cpp:311
std::vector< NameSpecifier * > getSpecifiers()
Definition Nodes.cpp:110
std::vector< List::ElementAndDelimiter< syntax::NameSpecifier > > getSpecifiersAndDoubleColons()
Definition Nodes.cpp:120
Models a parameter-declaration-list which appears within parameters-and-qualifiers.
Definition Nodes.h:540
std::vector< List::ElementAndDelimiter< syntax::SimpleDeclaration > > getParametersAndCommas()
Definition Nodes.cpp:164
std::vector< SimpleDeclaration * > getParameterDeclarations()
Definition Nodes.cpp:154
ParameterDeclarationList * getParameters()
Definition Nodes.cpp:424
TrailingReturnType * getTrailingReturn()
Definition Nodes.cpp:434
Expression * getReturnValue()
Definition Nodes.cpp:310
std::vector< SimpleDeclarator * > getDeclarators()
FIXME: use custom iterator instead of 'vector'.
Definition Nodes.cpp:357
A top-level declarator without parentheses.
Definition Nodes.h:494
An abstract node for C++ statements, e.g.
Definition Nodes.h:209
Trailing return type after the parameter list, including the arrow token.
Definition Nodes.h:527
SimpleDeclarator * getDeclarator()
Definition Nodes.cpp:414
Node * getFirstChild()
Definition Tree.h:179
const Node * findChild(NodeRole R) const
Find the first node with a corresponding role.
Definition Tree.cpp:302
NodeRole
A relation between a parent and child node, e.g.
Definition Nodes.h:54
@ ListElement
List API roles.
Definition Nodes.h:77
@ LiteralToken
A token that represents a literal, e.g. 'nullptr', '1', 'true', etc.
Definition Nodes.h:67
@ Detached
A node without a parent.
Definition Nodes.h:57
@ CloseParen
A closing parenthesis in argument lists and blocks, e.g. '}', ')', etc.
Definition Nodes.h:63
@ IntroducerKeyword
A keywords that introduces some grammar construct, e.g. 'if', 'try', etc.
Definition Nodes.h:65
@ Unknown
Children of an unknown semantic nature, e.g. skipped tokens, comments.
Definition Nodes.h:59
@ BodyStatement
An inner statement for those that have only a single child of kind statement, e.g.
Definition Nodes.h:75
@ OpenParen
An opening parenthesis in argument lists and blocks, e.g. '{', '(', etc.
Definition Nodes.h:61
@ ArrowToken
Tokens or Keywords.
Definition Nodes.h:69
NodeKind
A kind of a syntax node, used for implementing casts.
Definition Nodes.h:32
raw_ostream & operator<<(raw_ostream &OS, NodeKind K)
For debugging purposes.
Definition Nodes.cpp:13
The JSON file list parser is used to communicate input to InstallAPI.
U cast(CodeGen::Address addr)
Definition Address.h:327