Path: blob/main/contrib/llvm-project/clang/lib/Tooling/Syntax/Nodes.cpp
35271 views
//===- Nodes.cpp ----------------------------------------------*- C++ -*-=====//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7#include "clang/Tooling/Syntax/Nodes.h"8#include "llvm/Support/raw_ostream.h"910using namespace clang;1112raw_ostream &syntax::operator<<(raw_ostream &OS, NodeKind K) {13switch (K) {14#define CONCRETE_NODE(Kind, Parent) \15case NodeKind::Kind: \16return OS << #Kind;17#include "clang/Tooling/Syntax/Nodes.inc"18}19llvm_unreachable("unknown node kind");20}2122raw_ostream &syntax::operator<<(raw_ostream &OS, NodeRole R) {23switch (R) {24case syntax::NodeRole::Detached:25return OS << "Detached";26case syntax::NodeRole::Unknown:27return OS << "Unknown";28case syntax::NodeRole::OpenParen:29return OS << "OpenParen";30case syntax::NodeRole::CloseParen:31return OS << "CloseParen";32case syntax::NodeRole::IntroducerKeyword:33return OS << "IntroducerKeyword";34case syntax::NodeRole::LiteralToken:35return OS << "LiteralToken";36case syntax::NodeRole::ArrowToken:37return OS << "ArrowToken";38case syntax::NodeRole::ExternKeyword:39return OS << "ExternKeyword";40case syntax::NodeRole::TemplateKeyword:41return OS << "TemplateKeyword";42case syntax::NodeRole::BodyStatement:43return OS << "BodyStatement";44case syntax::NodeRole::ListElement:45return OS << "ListElement";46case syntax::NodeRole::ListDelimiter:47return OS << "ListDelimiter";48case syntax::NodeRole::CaseValue:49return OS << "CaseValue";50case syntax::NodeRole::ReturnValue:51return OS << "ReturnValue";52case syntax::NodeRole::ThenStatement:53return OS << "ThenStatement";54case syntax::NodeRole::ElseKeyword:55return OS << "ElseKeyword";56case syntax::NodeRole::ElseStatement:57return OS << "ElseStatement";58case syntax::NodeRole::OperatorToken:59return OS << "OperatorToken";60case syntax::NodeRole::Operand:61return OS << "Operand";62case syntax::NodeRole::LeftHandSide:63return OS << "LeftHandSide";64case syntax::NodeRole::RightHandSide:65return OS << "RightHandSide";66case syntax::NodeRole::Expression:67return OS << "Expression";68case syntax::NodeRole::Statement:69return OS << "Statement";70case syntax::NodeRole::Condition:71return OS << "Condition";72case syntax::NodeRole::Message:73return OS << "Message";74case syntax::NodeRole::Declarator:75return OS << "Declarator";76case syntax::NodeRole::Declaration:77return OS << "Declaration";78case syntax::NodeRole::Size:79return OS << "Size";80case syntax::NodeRole::Parameters:81return OS << "Parameters";82case syntax::NodeRole::TrailingReturn:83return OS << "TrailingReturn";84case syntax::NodeRole::UnqualifiedId:85return OS << "UnqualifiedId";86case syntax::NodeRole::Qualifier:87return OS << "Qualifier";88case syntax::NodeRole::SubExpression:89return OS << "SubExpression";90case syntax::NodeRole::Object:91return OS << "Object";92case syntax::NodeRole::AccessToken:93return OS << "AccessToken";94case syntax::NodeRole::Member:95return OS << "Member";96case syntax::NodeRole::Callee:97return OS << "Callee";98case syntax::NodeRole::Arguments:99return OS << "Arguments";100case syntax::NodeRole::Declarators:101return OS << "Declarators";102}103llvm_unreachable("invalid role");104}105106// We could have an interator in list to not pay memory costs of temporary107// vector108std::vector<syntax::NameSpecifier *>109syntax::NestedNameSpecifier::getSpecifiers() {110auto SpecifiersAsNodes = getElementsAsNodes();111std::vector<syntax::NameSpecifier *> Children;112for (const auto &Element : SpecifiersAsNodes) {113Children.push_back(llvm::cast<syntax::NameSpecifier>(Element));114}115return Children;116}117118std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>119syntax::NestedNameSpecifier::getSpecifiersAndDoubleColons() {120auto SpecifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters();121std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>>122Children;123for (const auto &SpecifierAndDoubleColon : SpecifiersAsNodesAndDoubleColons) {124Children.push_back(125{llvm::cast<syntax::NameSpecifier>(SpecifierAndDoubleColon.element),126SpecifierAndDoubleColon.delimiter});127}128return Children;129}130131std::vector<syntax::Expression *> syntax::CallArguments::getArguments() {132auto ArgumentsAsNodes = getElementsAsNodes();133std::vector<syntax::Expression *> Children;134for (const auto &ArgumentAsNode : ArgumentsAsNodes) {135Children.push_back(llvm::cast<syntax::Expression>(ArgumentAsNode));136}137return Children;138}139140std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>>141syntax::CallArguments::getArgumentsAndCommas() {142auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters();143std::vector<syntax::List::ElementAndDelimiter<syntax::Expression>> Children;144for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) {145Children.push_back(146{llvm::cast<syntax::Expression>(ArgumentAsNodeAndComma.element),147ArgumentAsNodeAndComma.delimiter});148}149return Children;150}151152std::vector<syntax::SimpleDeclaration *>153syntax::ParameterDeclarationList::getParameterDeclarations() {154auto ParametersAsNodes = getElementsAsNodes();155std::vector<syntax::SimpleDeclaration *> Children;156for (const auto &ParameterAsNode : ParametersAsNodes) {157Children.push_back(llvm::cast<syntax::SimpleDeclaration>(ParameterAsNode));158}159return Children;160}161162std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>163syntax::ParameterDeclarationList::getParametersAndCommas() {164auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters();165std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclaration>>166Children;167for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) {168Children.push_back(169{llvm::cast<syntax::SimpleDeclaration>(ParameterAsNodeAndComma.element),170ParameterAsNodeAndComma.delimiter});171}172return Children;173}174175std::vector<syntax::SimpleDeclarator *>176syntax::DeclaratorList::getDeclarators() {177auto DeclaratorsAsNodes = getElementsAsNodes();178std::vector<syntax::SimpleDeclarator *> Children;179for (const auto &DeclaratorAsNode : DeclaratorsAsNodes) {180Children.push_back(llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNode));181}182return Children;183}184185std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>186syntax::DeclaratorList::getDeclaratorsAndCommas() {187auto DeclaratorsAsNodesAndCommas = getElementsAsNodesAndDelimiters();188std::vector<syntax::List::ElementAndDelimiter<syntax::SimpleDeclarator>>189Children;190for (const auto &DeclaratorAsNodeAndComma : DeclaratorsAsNodesAndCommas) {191Children.push_back(192{llvm::cast<syntax::SimpleDeclarator>(DeclaratorAsNodeAndComma.element),193DeclaratorAsNodeAndComma.delimiter});194}195return Children;196}197198syntax::Expression *syntax::BinaryOperatorExpression::getLhs() {199return cast_or_null<syntax::Expression>(200findChild(syntax::NodeRole::LeftHandSide));201}202203syntax::Leaf *syntax::UnaryOperatorExpression::getOperatorToken() {204return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));205}206207syntax::Expression *syntax::UnaryOperatorExpression::getOperand() {208return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Operand));209}210211syntax::Leaf *syntax::BinaryOperatorExpression::getOperatorToken() {212return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OperatorToken));213}214215syntax::Expression *syntax::BinaryOperatorExpression::getRhs() {216return cast_or_null<syntax::Expression>(217findChild(syntax::NodeRole::RightHandSide));218}219220syntax::Leaf *syntax::SwitchStatement::getSwitchKeyword() {221return cast_or_null<syntax::Leaf>(222findChild(syntax::NodeRole::IntroducerKeyword));223}224225syntax::Statement *syntax::SwitchStatement::getBody() {226return cast_or_null<syntax::Statement>(227findChild(syntax::NodeRole::BodyStatement));228}229230syntax::Leaf *syntax::CaseStatement::getCaseKeyword() {231return cast_or_null<syntax::Leaf>(232findChild(syntax::NodeRole::IntroducerKeyword));233}234235syntax::Expression *syntax::CaseStatement::getCaseValue() {236return cast_or_null<syntax::Expression>(237findChild(syntax::NodeRole::CaseValue));238}239240syntax::Statement *syntax::CaseStatement::getBody() {241return cast_or_null<syntax::Statement>(242findChild(syntax::NodeRole::BodyStatement));243}244245syntax::Leaf *syntax::DefaultStatement::getDefaultKeyword() {246return cast_or_null<syntax::Leaf>(247findChild(syntax::NodeRole::IntroducerKeyword));248}249250syntax::Statement *syntax::DefaultStatement::getBody() {251return cast_or_null<syntax::Statement>(252findChild(syntax::NodeRole::BodyStatement));253}254255syntax::Leaf *syntax::IfStatement::getIfKeyword() {256return cast_or_null<syntax::Leaf>(257findChild(syntax::NodeRole::IntroducerKeyword));258}259260syntax::Statement *syntax::IfStatement::getThenStatement() {261return cast_or_null<syntax::Statement>(262findChild(syntax::NodeRole::ThenStatement));263}264265syntax::Leaf *syntax::IfStatement::getElseKeyword() {266return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ElseKeyword));267}268269syntax::Statement *syntax::IfStatement::getElseStatement() {270return cast_or_null<syntax::Statement>(271findChild(syntax::NodeRole::ElseStatement));272}273274syntax::Leaf *syntax::ForStatement::getForKeyword() {275return cast_or_null<syntax::Leaf>(276findChild(syntax::NodeRole::IntroducerKeyword));277}278279syntax::Statement *syntax::ForStatement::getBody() {280return cast_or_null<syntax::Statement>(281findChild(syntax::NodeRole::BodyStatement));282}283284syntax::Leaf *syntax::WhileStatement::getWhileKeyword() {285return cast_or_null<syntax::Leaf>(286findChild(syntax::NodeRole::IntroducerKeyword));287}288289syntax::Statement *syntax::WhileStatement::getBody() {290return cast_or_null<syntax::Statement>(291findChild(syntax::NodeRole::BodyStatement));292}293294syntax::Leaf *syntax::ContinueStatement::getContinueKeyword() {295return cast_or_null<syntax::Leaf>(296findChild(syntax::NodeRole::IntroducerKeyword));297}298299syntax::Leaf *syntax::BreakStatement::getBreakKeyword() {300return cast_or_null<syntax::Leaf>(301findChild(syntax::NodeRole::IntroducerKeyword));302}303304syntax::Leaf *syntax::ReturnStatement::getReturnKeyword() {305return cast_or_null<syntax::Leaf>(306findChild(syntax::NodeRole::IntroducerKeyword));307}308309syntax::Expression *syntax::ReturnStatement::getReturnValue() {310return cast_or_null<syntax::Expression>(311findChild(syntax::NodeRole::ReturnValue));312}313314syntax::Leaf *syntax::RangeBasedForStatement::getForKeyword() {315return cast_or_null<syntax::Leaf>(316findChild(syntax::NodeRole::IntroducerKeyword));317}318319syntax::Statement *syntax::RangeBasedForStatement::getBody() {320return cast_or_null<syntax::Statement>(321findChild(syntax::NodeRole::BodyStatement));322}323324syntax::Expression *syntax::ExpressionStatement::getExpression() {325return cast_or_null<syntax::Expression>(326findChild(syntax::NodeRole::Expression));327}328329syntax::Leaf *syntax::CompoundStatement::getLbrace() {330return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));331}332333std::vector<syntax::Statement *> syntax::CompoundStatement::getStatements() {334std::vector<syntax::Statement *> Children;335for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {336assert(C->getRole() == syntax::NodeRole::Statement);337Children.push_back(cast<syntax::Statement>(C));338}339return Children;340}341342syntax::Leaf *syntax::CompoundStatement::getRbrace() {343return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));344}345346syntax::Expression *syntax::StaticAssertDeclaration::getCondition() {347return cast_or_null<syntax::Expression>(348findChild(syntax::NodeRole::Condition));349}350351syntax::Expression *syntax::StaticAssertDeclaration::getMessage() {352return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Message));353}354355std::vector<syntax::SimpleDeclarator *>356syntax::SimpleDeclaration::getDeclarators() {357std::vector<syntax::SimpleDeclarator *> Children;358for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {359if (C->getRole() == syntax::NodeRole::Declarator)360Children.push_back(cast<syntax::SimpleDeclarator>(C));361}362return Children;363}364365syntax::Leaf *syntax::TemplateDeclaration::getTemplateKeyword() {366return cast_or_null<syntax::Leaf>(367findChild(syntax::NodeRole::IntroducerKeyword));368}369370syntax::Declaration *syntax::TemplateDeclaration::getDeclaration() {371return cast_or_null<syntax::Declaration>(372findChild(syntax::NodeRole::Declaration));373}374375syntax::Leaf *syntax::ExplicitTemplateInstantiation::getTemplateKeyword() {376return cast_or_null<syntax::Leaf>(377findChild(syntax::NodeRole::IntroducerKeyword));378}379380syntax::Leaf *syntax::ExplicitTemplateInstantiation::getExternKeyword() {381return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ExternKeyword));382}383384syntax::Declaration *syntax::ExplicitTemplateInstantiation::getDeclaration() {385return cast_or_null<syntax::Declaration>(386findChild(syntax::NodeRole::Declaration));387}388389syntax::Leaf *syntax::ParenDeclarator::getLparen() {390return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));391}392393syntax::Leaf *syntax::ParenDeclarator::getRparen() {394return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));395}396397syntax::Leaf *syntax::ArraySubscript::getLbracket() {398return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));399}400401syntax::Expression *syntax::ArraySubscript::getSize() {402return cast_or_null<syntax::Expression>(findChild(syntax::NodeRole::Size));403}404405syntax::Leaf *syntax::ArraySubscript::getRbracket() {406return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));407}408409syntax::Leaf *syntax::TrailingReturnType::getArrowToken() {410return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::ArrowToken));411}412413syntax::SimpleDeclarator *syntax::TrailingReturnType::getDeclarator() {414return cast_or_null<syntax::SimpleDeclarator>(415findChild(syntax::NodeRole::Declarator));416}417418syntax::Leaf *syntax::ParametersAndQualifiers::getLparen() {419return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::OpenParen));420}421422syntax::ParameterDeclarationList *423syntax::ParametersAndQualifiers::getParameters() {424return cast_or_null<syntax::ParameterDeclarationList>(425findChild(syntax::NodeRole::Parameters));426}427428syntax::Leaf *syntax::ParametersAndQualifiers::getRparen() {429return cast_or_null<syntax::Leaf>(findChild(syntax::NodeRole::CloseParen));430}431432syntax::TrailingReturnType *433syntax::ParametersAndQualifiers::getTrailingReturn() {434return cast_or_null<syntax::TrailingReturnType>(435findChild(syntax::NodeRole::TrailingReturn));436}437438#define NODE(Kind, Parent) \439static_assert(sizeof(syntax::Kind) > 0, "Missing Node subclass definition");440#include "clang/Tooling/Syntax/Nodes.inc"441442443