Home | History | Annotate | Line # | Download | only in Syntax
      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 #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