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