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(llvm::cast<syntax::SimpleDeclaration>(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 {llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element), 171 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(llvm::cast<syntax::SimpleDeclarator>(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 {llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNodeAndComma.element), 194 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 findChild(syntax::NodeRole::IntroducerKeyword)); 224 } 225 226 syntax::Statement *syntax::SwitchStatement::getBody() { 227 return cast_or_null<syntax::Statement>( 228 findChild(syntax::NodeRole::BodyStatement)); 229 } 230 231 syntax::Leaf *syntax::CaseStatement::getCaseKeyword() { 232 return cast_or_null<syntax::Leaf>( 233 findChild(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 findChild(syntax::NodeRole::BodyStatement)); 244 } 245 246 syntax::Leaf *syntax::DefaultStatement::getDefaultKeyword() { 247 return cast_or_null<syntax::Leaf>( 248 findChild(syntax::NodeRole::IntroducerKeyword)); 249 } 250 251 syntax::Statement *syntax::DefaultStatement::getBody() { 252 return cast_or_null<syntax::Statement>( 253 findChild(syntax::NodeRole::BodyStatement)); 254 } 255 256 syntax::Leaf *syntax::IfStatement::getIfKeyword() { 257 return cast_or_null<syntax::Leaf>( 258 findChild(syntax::NodeRole::IntroducerKeyword)); 259 } 260 261 syntax::Statement *syntax::IfStatement::getThenStatement() { 262 return cast_or_null<syntax::Statement>( 263 findChild(syntax::NodeRole::ThenStatement)); 264 } 265 266 syntax::Leaf *syntax::IfStatement::getElseKeyword() { 267 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ElseKeyword)); 268 } 269 270 syntax::Statement *syntax::IfStatement::getElseStatement() { 271 return cast_or_null<syntax::Statement>( 272 findChild(syntax::NodeRole::ElseStatement)); 273 } 274 275 syntax::Leaf *syntax::ForStatement::getForKeyword() { 276 return cast_or_null<syntax::Leaf>( 277 findChild(syntax::NodeRole::IntroducerKeyword)); 278 } 279 280 syntax::Statement *syntax::ForStatement::getBody() { 281 return cast_or_null<syntax::Statement>( 282 findChild(syntax::NodeRole::BodyStatement)); 283 } 284 285 syntax::Leaf *syntax::WhileStatement::getWhileKeyword() { 286 return cast_or_null<syntax::Leaf>( 287 findChild(syntax::NodeRole::IntroducerKeyword)); 288 } 289 290 syntax::Statement *syntax::WhileStatement::getBody() { 291 return cast_or_null<syntax::Statement>( 292 findChild(syntax::NodeRole::BodyStatement)); 293 } 294 295 syntax::Leaf *syntax::ContinueStatement::getContinueKeyword() { 296 return cast_or_null<syntax::Leaf>( 297 findChild(syntax::NodeRole::IntroducerKeyword)); 298 } 299 300 syntax::Leaf *syntax::BreakStatement::getBreakKeyword() { 301 return cast_or_null<syntax::Leaf>( 302 findChild(syntax::NodeRole::IntroducerKeyword)); 303 } 304 305 syntax::Leaf *syntax::ReturnStatement::getReturnKeyword() { 306 return cast_or_null<syntax::Leaf>( 307 findChild(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 findChild(syntax::NodeRole::IntroducerKeyword)); 318 } 319 320 syntax::Statement *syntax::RangeBasedForStatement::getBody() { 321 return cast_or_null<syntax::Statement>( 322 findChild(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>(findChild(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(cast<syntax::Statement>(C)); 339 } 340 return Children; 341 } 342 343 syntax::Leaf *syntax::CompoundStatement::getRbrace() { 344 return cast_or_null<syntax::Leaf>(findChild(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(cast<syntax::SimpleDeclarator>(C)); 362 } 363 return Children; 364 } 365 366 syntax::Leaf *syntax::TemplateDeclaration::getTemplateKeyword() { 367 return cast_or_null<syntax::Leaf>( 368 findChild(syntax::NodeRole::IntroducerKeyword)); 369 } 370 371 syntax::Declaration *syntax::TemplateDeclaration::getDeclaration() { 372 return cast_or_null<syntax::Declaration>( 373 findChild(syntax::NodeRole::Declaration)); 374 } 375 376 syntax::Leaf *syntax::ExplicitTemplateInstantiation::getTemplateKeyword() { 377 return cast_or_null<syntax::Leaf>( 378 findChild(syntax::NodeRole::IntroducerKeyword)); 379 } 380 381 syntax::Leaf *syntax::ExplicitTemplateInstantiation::getExternKeyword() { 382 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ExternKeyword)); 383 } 384 385 syntax::Declaration *syntax::ExplicitTemplateInstantiation::getDeclaration() { 386 return cast_or_null<syntax::Declaration>( 387 findChild(syntax::NodeRole::Declaration)); 388 } 389 390 syntax::Leaf *syntax::ParenDeclarator::getLparen() { 391 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 392 } 393 394 syntax::Leaf *syntax::ParenDeclarator::getRparen() { 395 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 396 } 397 398 syntax::Leaf *syntax::ArraySubscript::getLbracket() { 399 return cast_or_null<syntax::Leaf>(findChild(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>(findChild(syntax::NodeRole::CloseParen)); 408 } 409 410 syntax::Leaf *syntax::TrailingReturnType::getArrowToken() { 411 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ArrowToken)); 412 } 413 414 syntax::SimpleDeclarator *syntax::TrailingReturnType::getDeclarator() { 415 return cast_or_null<syntax::SimpleDeclarator>( 416 findChild(syntax::NodeRole::Declarator)); 417 } 418 419 syntax::Leaf *syntax::ParametersAndQualifiers::getLparen() { 420 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 421 } 422 423 syntax::ParameterDeclarationList * 424 syntax::ParametersAndQualifiers::getParameters() { 425 return cast_or_null<syntax::ParameterDeclarationList>( 426 findChild(syntax::NodeRole::Parameters)); 427 } 428 429 syntax::Leaf *syntax::ParametersAndQualifiers::getRparen() { 430 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 431 } 432 433 syntax::TrailingReturnType * 434 syntax::ParametersAndQualifiers::getTrailingReturn() { 435 return cast_or_null<syntax::TrailingReturnType>( 436 findChild(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