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 "clang/Basic/TokenKinds.h" 10 11 using namespace clang; 12 13 raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) { 14 switch (K) { 15 case NodeKind::Leaf: 16 return OS << "Leaf"; 17 case NodeKind::TranslationUnit: 18 return OS << "TranslationUnit"; 19 case NodeKind::UnknownExpression: 20 return OS << "UnknownExpression"; 21 case NodeKind::ParenExpression: 22 return OS << "ParenExpression"; 23 case NodeKind::ThisExpression: 24 return OS << "ThisExpression"; 25 case NodeKind::IntegerLiteralExpression: 26 return OS << "IntegerLiteralExpression"; 27 case NodeKind::CharacterLiteralExpression: 28 return OS << "CharacterLiteralExpression"; 29 case NodeKind::FloatingLiteralExpression: 30 return OS << "FloatingLiteralExpression"; 31 case NodeKind::StringLiteralExpression: 32 return OS << "StringLiteralExpression"; 33 case NodeKind::BoolLiteralExpression: 34 return OS << "BoolLiteralExpression"; 35 case NodeKind::CxxNullPtrExpression: 36 return OS << "CxxNullPtrExpression"; 37 case NodeKind::IntegerUserDefinedLiteralExpression: 38 return OS << "IntegerUserDefinedLiteralExpression"; 39 case NodeKind::FloatUserDefinedLiteralExpression: 40 return OS << "FloatUserDefinedLiteralExpression"; 41 case NodeKind::CharUserDefinedLiteralExpression: 42 return OS << "CharUserDefinedLiteralExpression"; 43 case NodeKind::StringUserDefinedLiteralExpression: 44 return OS << "StringUserDefinedLiteralExpression"; 45 case NodeKind::PrefixUnaryOperatorExpression: 46 return OS << "PrefixUnaryOperatorExpression"; 47 case NodeKind::PostfixUnaryOperatorExpression: 48 return OS << "PostfixUnaryOperatorExpression"; 49 case NodeKind::BinaryOperatorExpression: 50 return OS << "BinaryOperatorExpression"; 51 case NodeKind::UnqualifiedId: 52 return OS << "UnqualifiedId"; 53 case NodeKind::IdExpression: 54 return OS << "IdExpression"; 55 case NodeKind::CallExpression: 56 return OS << "CallExpression"; 57 case NodeKind::UnknownStatement: 58 return OS << "UnknownStatement"; 59 case NodeKind::DeclarationStatement: 60 return OS << "DeclarationStatement"; 61 case NodeKind::EmptyStatement: 62 return OS << "EmptyStatement"; 63 case NodeKind::SwitchStatement: 64 return OS << "SwitchStatement"; 65 case NodeKind::CaseStatement: 66 return OS << "CaseStatement"; 67 case NodeKind::DefaultStatement: 68 return OS << "DefaultStatement"; 69 case NodeKind::IfStatement: 70 return OS << "IfStatement"; 71 case NodeKind::ForStatement: 72 return OS << "ForStatement"; 73 case NodeKind::WhileStatement: 74 return OS << "WhileStatement"; 75 case NodeKind::ContinueStatement: 76 return OS << "ContinueStatement"; 77 case NodeKind::BreakStatement: 78 return OS << "BreakStatement"; 79 case NodeKind::ReturnStatement: 80 return OS << "ReturnStatement"; 81 case NodeKind::RangeBasedForStatement: 82 return OS << "RangeBasedForStatement"; 83 case NodeKind::ExpressionStatement: 84 return OS << "ExpressionStatement"; 85 case NodeKind::CompoundStatement: 86 return OS << "CompoundStatement"; 87 case NodeKind::UnknownDeclaration: 88 return OS << "UnknownDeclaration"; 89 case NodeKind::EmptyDeclaration: 90 return OS << "EmptyDeclaration"; 91 case NodeKind::StaticAssertDeclaration: 92 return OS << "StaticAssertDeclaration"; 93 case NodeKind::LinkageSpecificationDeclaration: 94 return OS << "LinkageSpecificationDeclaration"; 95 case NodeKind::SimpleDeclaration: 96 return OS << "SimpleDeclaration"; 97 case NodeKind::TemplateDeclaration: 98 return OS << "TemplateDeclaration"; 99 case NodeKind::ExplicitTemplateInstantiation: 100 return OS << "ExplicitTemplateInstantiation"; 101 case NodeKind::NamespaceDefinition: 102 return OS << "NamespaceDefinition"; 103 case NodeKind::NamespaceAliasDefinition: 104 return OS << "NamespaceAliasDefinition"; 105 case NodeKind::UsingNamespaceDirective: 106 return OS << "UsingNamespaceDirective"; 107 case NodeKind::UsingDeclaration: 108 return OS << "UsingDeclaration"; 109 case NodeKind::TypeAliasDeclaration: 110 return OS << "TypeAliasDeclaration"; 111 case NodeKind::SimpleDeclarator: 112 return OS << "SimpleDeclarator"; 113 case NodeKind::ParenDeclarator: 114 return OS << "ParenDeclarator"; 115 case NodeKind::ArraySubscript: 116 return OS << "ArraySubscript"; 117 case NodeKind::TrailingReturnType: 118 return OS << "TrailingReturnType"; 119 case NodeKind::ParametersAndQualifiers: 120 return OS << "ParametersAndQualifiers"; 121 case NodeKind::MemberPointer: 122 return OS << "MemberPointer"; 123 case NodeKind::GlobalNameSpecifier: 124 return OS << "GlobalNameSpecifier"; 125 case NodeKind::DecltypeNameSpecifier: 126 return OS << "DecltypeNameSpecifier"; 127 case NodeKind::IdentifierNameSpecifier: 128 return OS << "IdentifierNameSpecifier"; 129 case NodeKind::SimpleTemplateNameSpecifier: 130 return OS << "SimpleTemplateNameSpecifier"; 131 case NodeKind::NestedNameSpecifier: 132 return OS << "NestedNameSpecifier"; 133 case NodeKind::MemberExpression: 134 return OS << "MemberExpression"; 135 case NodeKind::CallArguments: 136 return OS << "CallArguments"; 137 case NodeKind::ParameterDeclarationList: 138 return OS << "ParameterDeclarationList"; 139 } 140 llvm_unreachable("unknown node kind"); 141 } 142 143 raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) { 144 switch (R) { 145 case syntax::NodeRole::Detached: 146 return OS << "Detached"; 147 case syntax::NodeRole::Unknown: 148 return OS << "Unknown"; 149 case syntax::NodeRole::OpenParen: 150 return OS << "OpenParen"; 151 case syntax::NodeRole::CloseParen: 152 return OS << "CloseParen"; 153 case syntax::NodeRole::IntroducerKeyword: 154 return OS << "IntroducerKeyword"; 155 case syntax::NodeRole::LiteralToken: 156 return OS << "LiteralToken"; 157 case syntax::NodeRole::ArrowToken: 158 return OS << "ArrowToken"; 159 case syntax::NodeRole::ExternKeyword: 160 return OS << "ExternKeyword"; 161 case syntax::NodeRole::TemplateKeyword: 162 return OS << "TemplateKeyword"; 163 case syntax::NodeRole::BodyStatement: 164 return OS << "BodyStatement"; 165 case syntax::NodeRole::List_element: 166 return OS << "List_element"; 167 case syntax::NodeRole::List_delimiter: 168 return OS << "List_delimiter"; 169 case syntax::NodeRole::CaseStatement_value: 170 return OS << "CaseStatement_value"; 171 case syntax::NodeRole::IfStatement_thenStatement: 172 return OS << "IfStatement_thenStatement"; 173 case syntax::NodeRole::IfStatement_elseKeyword: 174 return OS << "IfStatement_elseKeyword"; 175 case syntax::NodeRole::IfStatement_elseStatement: 176 return OS << "IfStatement_elseStatement"; 177 case syntax::NodeRole::OperatorExpression_operatorToken: 178 return OS << "OperatorExpression_operatorToken"; 179 case syntax::NodeRole::UnaryOperatorExpression_operand: 180 return OS << "UnaryOperatorExpression_operand"; 181 case syntax::NodeRole::BinaryOperatorExpression_leftHandSide: 182 return OS << "BinaryOperatorExpression_leftHandSide"; 183 case syntax::NodeRole::BinaryOperatorExpression_rightHandSide: 184 return OS << "BinaryOperatorExpression_rightHandSide"; 185 case syntax::NodeRole::ReturnStatement_value: 186 return OS << "ReturnStatement_value"; 187 case syntax::NodeRole::ExpressionStatement_expression: 188 return OS << "ExpressionStatement_expression"; 189 case syntax::NodeRole::CompoundStatement_statement: 190 return OS << "CompoundStatement_statement"; 191 case syntax::NodeRole::StaticAssertDeclaration_condition: 192 return OS << "StaticAssertDeclaration_condition"; 193 case syntax::NodeRole::StaticAssertDeclaration_message: 194 return OS << "StaticAssertDeclaration_message"; 195 case syntax::NodeRole::SimpleDeclaration_declarator: 196 return OS << "SimpleDeclaration_declarator"; 197 case syntax::NodeRole::TemplateDeclaration_declaration: 198 return OS << "TemplateDeclaration_declaration"; 199 case syntax::NodeRole::ExplicitTemplateInstantiation_declaration: 200 return OS << "ExplicitTemplateInstantiation_declaration"; 201 case syntax::NodeRole::ArraySubscript_sizeExpression: 202 return OS << "ArraySubscript_sizeExpression"; 203 case syntax::NodeRole::TrailingReturnType_declarator: 204 return OS << "TrailingReturnType_declarator"; 205 case syntax::NodeRole::ParametersAndQualifiers_parameters: 206 return OS << "ParametersAndQualifiers_parameters"; 207 case syntax::NodeRole::ParametersAndQualifiers_trailingReturn: 208 return OS << "ParametersAndQualifiers_trailingReturn"; 209 case syntax::NodeRole::IdExpression_id: 210 return OS << "IdExpression_id"; 211 case syntax::NodeRole::IdExpression_qualifier: 212 return OS << "IdExpression_qualifier"; 213 case syntax::NodeRole::ParenExpression_subExpression: 214 return OS << "ParenExpression_subExpression"; 215 case syntax::NodeRole::MemberExpression_object: 216 return OS << "MemberExpression_object"; 217 case syntax::NodeRole::MemberExpression_accessToken: 218 return OS << "MemberExpression_accessToken"; 219 case syntax::NodeRole::MemberExpression_member: 220 return OS << "MemberExpression_member"; 221 case syntax::NodeRole::CallExpression_callee: 222 return OS << "CallExpression_callee"; 223 case syntax::NodeRole::CallExpression_arguments: 224 return OS << "CallExpression_arguments"; 225 } 226 llvm_unreachable("invalid role"); 227 } 228 229 // We could have an interator in list to not pay memory costs of temporary 230 // vector 231 std::vector<syntax::NameSpecifier *> syntax::NestedNameSpecifier::specifiers() { 232 auto specifiersAsNodes = getElementsAsNodes(); 233 std::vector<syntax::NameSpecifier *> Children; 234 for (const auto &element : specifiersAsNodes) { 235 Children.push_back(llvm::cast<syntax::NameSpecifier>(element)); 236 } 237 return Children; 238 } 239 240 std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>> 241 syntax::NestedNameSpecifier::specifiersAndDoubleColons() { 242 auto specifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters(); 243 std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>> 244 Children; 245 for (const auto &specifierAndDoubleColon : specifiersAsNodesAndDoubleColons) { 246 Children.push_back( 247 {llvm::cast<syntax::NameSpecifier>(specifierAndDoubleColon.element), 248 specifierAndDoubleColon.delimiter}); 249 } 250 return Children; 251 } 252 253 std::vector<syntax::Expression *> syntax::CallArguments::arguments() { 254 auto ArgumentsAsNodes = getElementsAsNodes(); 255 std::vector<syntax::Expression *> Children; 256 for (const auto &ArgumentAsNode : ArgumentsAsNodes) { 257 Children.push_back(llvm::cast<syntax::Expression>(ArgumentAsNode)); 258 } 259 return Children; 260 } 261 262 std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> 263 syntax::CallArguments::argumentsAndCommas() { 264 auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters(); 265 std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> Children; 266 for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) { 267 Children.push_back( 268 {llvm::cast<syntax::Expression>(ArgumentAsNodeAndComma.element), 269 ArgumentAsNodeAndComma.delimiter}); 270 } 271 return Children; 272 } 273 274 std::vector<syntax::SimpleDeclaration *> 275 syntax::ParameterDeclarationList::parameterDeclarations() { 276 auto ParametersAsNodes = getElementsAsNodes(); 277 std::vector<syntax::SimpleDeclaration *> Children; 278 for (const auto &ParameterAsNode : ParametersAsNodes) { 279 Children.push_back(llvm::cast<syntax::SimpleDeclaration>(ParameterAsNode)); 280 } 281 return Children; 282 } 283 284 std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>> 285 syntax::ParameterDeclarationList::parametersAndCommas() { 286 auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters(); 287 std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>> 288 Children; 289 for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) { 290 Children.push_back( 291 {llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element), 292 ParameterAsNodeAndComma.delimiter}); 293 } 294 return Children; 295 } 296 297 syntax::Expression *syntax::MemberExpression::object() { 298 return cast_or_null<syntax::Expression>( 299 findChild(syntax::NodeRole::MemberExpression_object)); 300 } 301 302 syntax::Leaf *syntax::MemberExpression::templateKeyword() { 303 return llvm::cast_or_null<syntax::Leaf>( 304 findChild(syntax::NodeRole::TemplateKeyword)); 305 } 306 307 syntax::Leaf *syntax::MemberExpression::accessToken() { 308 return llvm::cast_or_null<syntax::Leaf>( 309 findChild(syntax::NodeRole::MemberExpression_accessToken)); 310 } 311 312 syntax::IdExpression *syntax::MemberExpression::member() { 313 return cast_or_null<syntax::IdExpression>( 314 findChild(syntax::NodeRole::MemberExpression_member)); 315 } 316 317 syntax::NestedNameSpecifier *syntax::IdExpression::qualifier() { 318 return cast_or_null<syntax::NestedNameSpecifier>( 319 findChild(syntax::NodeRole::IdExpression_qualifier)); 320 } 321 322 syntax::Leaf *syntax::IdExpression::templateKeyword() { 323 return llvm::cast_or_null<syntax::Leaf>( 324 findChild(syntax::NodeRole::TemplateKeyword)); 325 } 326 327 syntax::UnqualifiedId *syntax::IdExpression::unqualifiedId() { 328 return cast_or_null<syntax::UnqualifiedId>( 329 findChild(syntax::NodeRole::IdExpression_id)); 330 } 331 332 syntax::Leaf *syntax::ParenExpression::openParen() { 333 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 334 } 335 336 syntax::Expression *syntax::ParenExpression::subExpression() { 337 return cast_or_null<syntax::Expression>( 338 findChild(syntax::NodeRole::ParenExpression_subExpression)); 339 } 340 341 syntax::Leaf *syntax::ParenExpression::closeParen() { 342 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 343 } 344 345 syntax::Leaf *syntax::ThisExpression::thisKeyword() { 346 return cast_or_null<syntax::Leaf>( 347 findChild(syntax::NodeRole::IntroducerKeyword)); 348 } 349 350 syntax::Leaf *syntax::LiteralExpression::literalToken() { 351 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::LiteralToken)); 352 } 353 354 syntax::Expression *syntax::BinaryOperatorExpression::lhs() { 355 return cast_or_null<syntax::Expression>( 356 findChild(syntax::NodeRole::BinaryOperatorExpression_leftHandSide)); 357 } 358 359 syntax::Leaf *syntax::UnaryOperatorExpression::operatorToken() { 360 return cast_or_null<syntax::Leaf>( 361 findChild(syntax::NodeRole::OperatorExpression_operatorToken)); 362 } 363 364 syntax::Expression *syntax::UnaryOperatorExpression::operand() { 365 return cast_or_null<syntax::Expression>( 366 findChild(syntax::NodeRole::UnaryOperatorExpression_operand)); 367 } 368 369 syntax::Leaf *syntax::BinaryOperatorExpression::operatorToken() { 370 return cast_or_null<syntax::Leaf>( 371 findChild(syntax::NodeRole::OperatorExpression_operatorToken)); 372 } 373 374 syntax::Expression *syntax::BinaryOperatorExpression::rhs() { 375 return cast_or_null<syntax::Expression>( 376 findChild(syntax::NodeRole::BinaryOperatorExpression_rightHandSide)); 377 } 378 379 syntax::Expression *syntax::CallExpression::callee() { 380 return cast_or_null<syntax::Expression>( 381 findChild(syntax::NodeRole::CallExpression_callee)); 382 } 383 384 syntax::Leaf *syntax::CallExpression::openParen() { 385 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 386 } 387 388 syntax::CallArguments *syntax::CallExpression::arguments() { 389 return cast_or_null<syntax::CallArguments>( 390 findChild(syntax::NodeRole::CallExpression_arguments)); 391 } 392 393 syntax::Leaf *syntax::CallExpression::closeParen() { 394 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 395 } 396 397 syntax::Leaf *syntax::SwitchStatement::switchKeyword() { 398 return cast_or_null<syntax::Leaf>( 399 findChild(syntax::NodeRole::IntroducerKeyword)); 400 } 401 402 syntax::Statement *syntax::SwitchStatement::body() { 403 return cast_or_null<syntax::Statement>( 404 findChild(syntax::NodeRole::BodyStatement)); 405 } 406 407 syntax::Leaf *syntax::CaseStatement::caseKeyword() { 408 return cast_or_null<syntax::Leaf>( 409 findChild(syntax::NodeRole::IntroducerKeyword)); 410 } 411 412 syntax::Expression *syntax::CaseStatement::value() { 413 return cast_or_null<syntax::Expression>( 414 findChild(syntax::NodeRole::CaseStatement_value)); 415 } 416 417 syntax::Statement *syntax::CaseStatement::body() { 418 return cast_or_null<syntax::Statement>( 419 findChild(syntax::NodeRole::BodyStatement)); 420 } 421 422 syntax::Leaf *syntax::DefaultStatement::defaultKeyword() { 423 return cast_or_null<syntax::Leaf>( 424 findChild(syntax::NodeRole::IntroducerKeyword)); 425 } 426 427 syntax::Statement *syntax::DefaultStatement::body() { 428 return cast_or_null<syntax::Statement>( 429 findChild(syntax::NodeRole::BodyStatement)); 430 } 431 432 syntax::Leaf *syntax::IfStatement::ifKeyword() { 433 return cast_or_null<syntax::Leaf>( 434 findChild(syntax::NodeRole::IntroducerKeyword)); 435 } 436 437 syntax::Statement *syntax::IfStatement::thenStatement() { 438 return cast_or_null<syntax::Statement>( 439 findChild(syntax::NodeRole::IfStatement_thenStatement)); 440 } 441 442 syntax::Leaf *syntax::IfStatement::elseKeyword() { 443 return cast_or_null<syntax::Leaf>( 444 findChild(syntax::NodeRole::IfStatement_elseKeyword)); 445 } 446 447 syntax::Statement *syntax::IfStatement::elseStatement() { 448 return cast_or_null<syntax::Statement>( 449 findChild(syntax::NodeRole::IfStatement_elseStatement)); 450 } 451 452 syntax::Leaf *syntax::ForStatement::forKeyword() { 453 return cast_or_null<syntax::Leaf>( 454 findChild(syntax::NodeRole::IntroducerKeyword)); 455 } 456 457 syntax::Statement *syntax::ForStatement::body() { 458 return cast_or_null<syntax::Statement>( 459 findChild(syntax::NodeRole::BodyStatement)); 460 } 461 462 syntax::Leaf *syntax::WhileStatement::whileKeyword() { 463 return cast_or_null<syntax::Leaf>( 464 findChild(syntax::NodeRole::IntroducerKeyword)); 465 } 466 467 syntax::Statement *syntax::WhileStatement::body() { 468 return cast_or_null<syntax::Statement>( 469 findChild(syntax::NodeRole::BodyStatement)); 470 } 471 472 syntax::Leaf *syntax::ContinueStatement::continueKeyword() { 473 return cast_or_null<syntax::Leaf>( 474 findChild(syntax::NodeRole::IntroducerKeyword)); 475 } 476 477 syntax::Leaf *syntax::BreakStatement::breakKeyword() { 478 return cast_or_null<syntax::Leaf>( 479 findChild(syntax::NodeRole::IntroducerKeyword)); 480 } 481 482 syntax::Leaf *syntax::ReturnStatement::returnKeyword() { 483 return cast_or_null<syntax::Leaf>( 484 findChild(syntax::NodeRole::IntroducerKeyword)); 485 } 486 487 syntax::Expression *syntax::ReturnStatement::value() { 488 return cast_or_null<syntax::Expression>( 489 findChild(syntax::NodeRole::ReturnStatement_value)); 490 } 491 492 syntax::Leaf *syntax::RangeBasedForStatement::forKeyword() { 493 return cast_or_null<syntax::Leaf>( 494 findChild(syntax::NodeRole::IntroducerKeyword)); 495 } 496 497 syntax::Statement *syntax::RangeBasedForStatement::body() { 498 return cast_or_null<syntax::Statement>( 499 findChild(syntax::NodeRole::BodyStatement)); 500 } 501 502 syntax::Expression *syntax::ExpressionStatement::expression() { 503 return cast_or_null<syntax::Expression>( 504 findChild(syntax::NodeRole::ExpressionStatement_expression)); 505 } 506 507 syntax::Leaf *syntax::CompoundStatement::lbrace() { 508 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 509 } 510 511 std::vector<syntax::Statement *> syntax::CompoundStatement::statements() { 512 std::vector<syntax::Statement *> Children; 513 for (auto *C = firstChild(); C; C = C->nextSibling()) { 514 assert(C->role() == syntax::NodeRole::CompoundStatement_statement); 515 Children.push_back(cast<syntax::Statement>(C)); 516 } 517 return Children; 518 } 519 520 syntax::Leaf *syntax::CompoundStatement::rbrace() { 521 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 522 } 523 524 syntax::Expression *syntax::StaticAssertDeclaration::condition() { 525 return cast_or_null<syntax::Expression>( 526 findChild(syntax::NodeRole::StaticAssertDeclaration_condition)); 527 } 528 529 syntax::Expression *syntax::StaticAssertDeclaration::message() { 530 return cast_or_null<syntax::Expression>( 531 findChild(syntax::NodeRole::StaticAssertDeclaration_message)); 532 } 533 534 std::vector<syntax::SimpleDeclarator *> 535 syntax::SimpleDeclaration::declarators() { 536 std::vector<syntax::SimpleDeclarator *> Children; 537 for (auto *C = firstChild(); C; C = C->nextSibling()) { 538 if (C->role() == syntax::NodeRole::SimpleDeclaration_declarator) 539 Children.push_back(cast<syntax::SimpleDeclarator>(C)); 540 } 541 return Children; 542 } 543 544 syntax::Leaf *syntax::TemplateDeclaration::templateKeyword() { 545 return cast_or_null<syntax::Leaf>( 546 findChild(syntax::NodeRole::IntroducerKeyword)); 547 } 548 549 syntax::Declaration *syntax::TemplateDeclaration::declaration() { 550 return cast_or_null<syntax::Declaration>( 551 findChild(syntax::NodeRole::TemplateDeclaration_declaration)); 552 } 553 554 syntax::Leaf *syntax::ExplicitTemplateInstantiation::templateKeyword() { 555 return cast_or_null<syntax::Leaf>( 556 findChild(syntax::NodeRole::IntroducerKeyword)); 557 } 558 559 syntax::Leaf *syntax::ExplicitTemplateInstantiation::externKeyword() { 560 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ExternKeyword)); 561 } 562 563 syntax::Declaration *syntax::ExplicitTemplateInstantiation::declaration() { 564 return cast_or_null<syntax::Declaration>( 565 findChild(syntax::NodeRole::ExplicitTemplateInstantiation_declaration)); 566 } 567 568 syntax::Leaf *syntax::ParenDeclarator::lparen() { 569 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 570 } 571 572 syntax::Leaf *syntax::ParenDeclarator::rparen() { 573 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 574 } 575 576 syntax::Leaf *syntax::ArraySubscript::lbracket() { 577 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 578 } 579 580 syntax::Expression *syntax::ArraySubscript::sizeExpression() { 581 return cast_or_null<syntax::Expression>( 582 findChild(syntax::NodeRole::ArraySubscript_sizeExpression)); 583 } 584 585 syntax::Leaf *syntax::ArraySubscript::rbracket() { 586 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 587 } 588 589 syntax::Leaf *syntax::TrailingReturnType::arrowToken() { 590 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ArrowToken)); 591 } 592 593 syntax::SimpleDeclarator *syntax::TrailingReturnType::declarator() { 594 return cast_or_null<syntax::SimpleDeclarator>( 595 findChild(syntax::NodeRole::TrailingReturnType_declarator)); 596 } 597 598 syntax::Leaf *syntax::ParametersAndQualifiers::lparen() { 599 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen)); 600 } 601 602 syntax::ParameterDeclarationList * 603 syntax::ParametersAndQualifiers::parameters() { 604 return cast_or_null<syntax::ParameterDeclarationList>( 605 findChild(syntax::NodeRole::ParametersAndQualifiers_parameters)); 606 } 607 608 syntax::Leaf *syntax::ParametersAndQualifiers::rparen() { 609 return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen)); 610 } 611 612 syntax::TrailingReturnType *syntax::ParametersAndQualifiers::trailingReturn() { 613 return cast_or_null<syntax::TrailingReturnType>( 614 findChild(syntax::NodeRole::ParametersAndQualifiers_trailingReturn)); 615 } 616