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