Nodes.cpp revision 360784
167754Smsmith//===- Nodes.cpp ----------------------------------------------*- C++ -*-=====//
267754Smsmith//
377424Smsmith// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
467754Smsmith// See https://llvm.org/LICENSE.txt for license information.
567754Smsmith// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667754Smsmith//
767754Smsmith//===----------------------------------------------------------------------===//
867754Smsmith#include "clang/Tooling/Syntax/Nodes.h"
967754Smsmith#include "clang/Basic/TokenKinds.h"
1067754Smsmith
11202771Sjkimusing namespace clang;
1270243Smsmith
1367754Smsmithllvm::raw_ostream &syntax::operator<<(llvm::raw_ostream &OS, NodeKind K) {
1467754Smsmith  switch (K) {
1567754Smsmith  case NodeKind::Leaf:
1667754Smsmith    return OS << "Leaf";
1767754Smsmith  case NodeKind::TranslationUnit:
1867754Smsmith    return OS << "TranslationUnit";
1967754Smsmith  case NodeKind::UnknownExpression:
2067754Smsmith    return OS << "UnknownExpression";
2167754Smsmith  case NodeKind::UnknownStatement:
2267754Smsmith    return OS << "UnknownStatement";
2367754Smsmith  case NodeKind::DeclarationStatement:
2467754Smsmith    return OS << "DeclarationStatement";
2567754Smsmith  case NodeKind::EmptyStatement:
2667754Smsmith    return OS << "EmptyStatement";
2767754Smsmith  case NodeKind::SwitchStatement:
2867754Smsmith    return OS << "SwitchStatement";
2967754Smsmith  case NodeKind::CaseStatement:
3067754Smsmith    return OS << "CaseStatement";
3167754Smsmith  case NodeKind::DefaultStatement:
3267754Smsmith    return OS << "DefaultStatement";
3367754Smsmith  case NodeKind::IfStatement:
3467754Smsmith    return OS << "IfStatement";
3567754Smsmith  case NodeKind::ForStatement:
3667754Smsmith    return OS << "ForStatement";
3767754Smsmith  case NodeKind::WhileStatement:
3867754Smsmith    return OS << "WhileStatement";
3967754Smsmith  case NodeKind::ContinueStatement:
4067754Smsmith    return OS << "ContinueStatement";
4167754Smsmith  case NodeKind::BreakStatement:
4267754Smsmith    return OS << "BreakStatement";
4367754Smsmith  case NodeKind::ReturnStatement:
4467754Smsmith    return OS << "ReturnStatement";
4567754Smsmith  case NodeKind::RangeBasedForStatement:
4667754Smsmith    return OS << "RangeBasedForStatement";
4767754Smsmith  case NodeKind::ExpressionStatement:
4867754Smsmith    return OS << "ExpressionStatement";
4967754Smsmith  case NodeKind::CompoundStatement:
5067754Smsmith    return OS << "CompoundStatement";
5167754Smsmith  case NodeKind::UnknownDeclaration:
5267754Smsmith    return OS << "UnknownDeclaration";
5367754Smsmith  case NodeKind::EmptyDeclaration:
5467754Smsmith    return OS << "EmptyDeclaration";
5567754Smsmith  case NodeKind::StaticAssertDeclaration:
5667754Smsmith    return OS << "StaticAssertDeclaration";
5767754Smsmith  case NodeKind::LinkageSpecificationDeclaration:
5867754Smsmith    return OS << "LinkageSpecificationDeclaration";
5967754Smsmith  case NodeKind::SimpleDeclaration:
6067754Smsmith    return OS << "SimpleDeclaration";
6167754Smsmith  case NodeKind::NamespaceDefinition:
6267754Smsmith    return OS << "NamespaceDefinition";
6367754Smsmith  case NodeKind::NamespaceAliasDefinition:
6467754Smsmith    return OS << "NamespaceAliasDefinition";
6567754Smsmith  case NodeKind::UsingNamespaceDirective:
6667754Smsmith    return OS << "UsingNamespaceDirective";
6767754Smsmith  case NodeKind::UsingDeclaration:
6867754Smsmith    return OS << "UsingDeclaration";
6967754Smsmith  case NodeKind::TypeAliasDeclaration:
7067754Smsmith    return OS << "TypeAliasDeclaration";
7167754Smsmith  }
7267754Smsmith  llvm_unreachable("unknown node kind");
7367754Smsmith}
7467754Smsmith
7567754Smsmithllvm::raw_ostream &syntax::operator<<(llvm::raw_ostream &OS, NodeRole R) {
7667754Smsmith  switch (R) {
7767754Smsmith  case syntax::NodeRole::Detached:
7867754Smsmith    return OS << "Detached";
7967754Smsmith  case syntax::NodeRole::Unknown:
8067754Smsmith    return OS << "Unknown";
8167754Smsmith  case syntax::NodeRole::OpenParen:
8267754Smsmith    return OS << "OpenParen";
8367754Smsmith  case syntax::NodeRole::CloseParen:
8467754Smsmith    return OS << "CloseParen";
8567754Smsmith  case syntax::NodeRole::IntroducerKeyword:
8667754Smsmith    return OS << "IntroducerKeyword";
8767754Smsmith  case syntax::NodeRole::BodyStatement:
8867754Smsmith    return OS << "BodyStatement";
8967754Smsmith  case syntax::NodeRole::CaseStatement_value:
9067754Smsmith    return OS << "CaseStatement_value";
9167754Smsmith  case syntax::NodeRole::IfStatement_thenStatement:
9267754Smsmith    return OS << "IfStatement_thenStatement";
9367754Smsmith  case syntax::NodeRole::IfStatement_elseKeyword:
9467754Smsmith    return OS << "IfStatement_elseKeyword";
9567754Smsmith  case syntax::NodeRole::IfStatement_elseStatement:
9667754Smsmith    return OS << "IfStatement_elseStatement";
9767754Smsmith  case syntax::NodeRole::ReturnStatement_value:
9867754Smsmith    return OS << "ReturnStatement_value";
9967754Smsmith  case syntax::NodeRole::ExpressionStatement_expression:
10067754Smsmith    return OS << "ExpressionStatement_expression";
10167754Smsmith  case syntax::NodeRole::CompoundStatement_statement:
10267754Smsmith    return OS << "CompoundStatement_statement";
10367754Smsmith  case syntax::NodeRole::StaticAssertDeclaration_condition:
10467754Smsmith    return OS << "StaticAssertDeclaration_condition";
10567754Smsmith  case syntax::NodeRole::StaticAssertDeclaration_message:
10667754Smsmith    return OS << "StaticAssertDeclaration_message";
10767754Smsmith  }
10867754Smsmith  llvm_unreachable("invalid role");
10967754Smsmith}
11067754Smsmith
11167754Smsmithsyntax::Leaf *syntax::SwitchStatement::switchKeyword() {
11267754Smsmith  return llvm::cast_or_null<syntax::Leaf>(
11367754Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
11467754Smsmith}
11567754Smsmith
11667754Smsmithsyntax::Statement *syntax::SwitchStatement::body() {
11777424Smsmith  return llvm::cast_or_null<syntax::Statement>(
11867754Smsmith      findChild(syntax::NodeRole::BodyStatement));
119193341Sjkim}
120193341Sjkim
121193341Sjkimsyntax::Leaf *syntax::CaseStatement::caseKeyword() {
122193341Sjkim  return llvm::cast_or_null<syntax::Leaf>(
123193341Sjkim      findChild(syntax::NodeRole::IntroducerKeyword));
124193341Sjkim}
12567754Smsmith
12667754Smsmithsyntax::Expression *syntax::CaseStatement::value() {
12777424Smsmith  return llvm::cast_or_null<syntax::Expression>(
12891116Smsmith      findChild(syntax::NodeRole::CaseStatement_value));
12967754Smsmith}
130151937Sjkim
13167754Smsmithsyntax::Statement *syntax::CaseStatement::body() {
132151937Sjkim  return llvm::cast_or_null<syntax::Statement>(
133151937Sjkim      findChild(syntax::NodeRole::BodyStatement));
134151937Sjkim}
135151937Sjkim
136202771Sjkimsyntax::Leaf *syntax::DefaultStatement::defaultKeyword() {
137151937Sjkim  return llvm::cast_or_null<syntax::Leaf>(
138151937Sjkim      findChild(syntax::NodeRole::IntroducerKeyword));
139151937Sjkim}
140151937Sjkim
141151937Sjkimsyntax::Statement *syntax::DefaultStatement::body() {
142202771Sjkim  return llvm::cast_or_null<syntax::Statement>(
143151937Sjkim      findChild(syntax::NodeRole::BodyStatement));
144151937Sjkim}
145151937Sjkim
146151937Sjkimsyntax::Leaf *syntax::IfStatement::ifKeyword() {
147151937Sjkim  return llvm::cast_or_null<syntax::Leaf>(
148151937Sjkim      findChild(syntax::NodeRole::IntroducerKeyword));
149151937Sjkim}
15067754Smsmith
15167754Smsmithsyntax::Statement *syntax::IfStatement::thenStatement() {
15287031Smsmith  return llvm::cast_or_null<syntax::Statement>(
15367754Smsmith      findChild(syntax::NodeRole::IfStatement_thenStatement));
154151937Sjkim}
15587031Smsmith
15687031Smsmithsyntax::Leaf *syntax::IfStatement::elseKeyword() {
15767754Smsmith  return llvm::cast_or_null<syntax::Leaf>(
15867754Smsmith      findChild(syntax::NodeRole::IfStatement_elseKeyword));
15967754Smsmith}
16077424Smsmith
161123315Snjlsyntax::Statement *syntax::IfStatement::elseStatement() {
162123315Snjl  return llvm::cast_or_null<syntax::Statement>(
16367754Smsmith      findChild(syntax::NodeRole::IfStatement_elseStatement));
16467754Smsmith}
16567754Smsmith
166151937Sjkimsyntax::Leaf *syntax::ForStatement::forKeyword() {
16787031Smsmith  return llvm::cast_or_null<syntax::Leaf>(
16867754Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
16977424Smsmith}
17067754Smsmith
17177424Smsmithsyntax::Statement *syntax::ForStatement::body() {
17277424Smsmith  return llvm::cast_or_null<syntax::Statement>(
17367754Smsmith      findChild(syntax::NodeRole::BodyStatement));
17467754Smsmith}
175167802Sjkim
17667754Smsmithsyntax::Leaf *syntax::WhileStatement::whileKeyword() {
17783174Smsmith  return llvm::cast_or_null<syntax::Leaf>(
17877424Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
17967754Smsmith}
180107325Siwasaki
181107325Siwasakisyntax::Statement *syntax::WhileStatement::body() {
182193267Sjkim  return llvm::cast_or_null<syntax::Statement>(
18377424Smsmith      findChild(syntax::NodeRole::BodyStatement));
184167802Sjkim}
185193267Sjkim
18699679Siwasakisyntax::Leaf *syntax::ContinueStatement::continueKeyword() {
18799679Siwasaki  return llvm::cast_or_null<syntax::Leaf>(
18877424Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
18977424Smsmith}
19067754Smsmith
19177424Smsmithsyntax::Leaf *syntax::BreakStatement::breakKeyword() {
19277424Smsmith  return llvm::cast_or_null<syntax::Leaf>(
19377424Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
19477424Smsmith}
195123315Snjl
19667754Smsmithsyntax::Leaf *syntax::ReturnStatement::returnKeyword() {
19777424Smsmith  return llvm::cast_or_null<syntax::Leaf>(
19877424Smsmith      findChild(syntax::NodeRole::IntroducerKeyword));
19977424Smsmith}
20077424Smsmith
20177424Smsmithsyntax::Expression *syntax::ReturnStatement::value() {
20267754Smsmith  return llvm::cast_or_null<syntax::Expression>(
20367754Smsmith      findChild(syntax::NodeRole::ReturnStatement_value));
204167802Sjkim}
205197104Sjkim
206167802Sjkimsyntax::Leaf *syntax::RangeBasedForStatement::forKeyword() {
207167802Sjkim  return llvm::cast_or_null<syntax::Leaf>(
208197104Sjkim      findChild(syntax::NodeRole::IntroducerKeyword));
209197104Sjkim}
210107325Siwasaki
211197104Sjkimsyntax::Statement *syntax::RangeBasedForStatement::body() {
212107325Siwasaki  return llvm::cast_or_null<syntax::Statement>(
213107325Siwasaki      findChild(syntax::NodeRole::BodyStatement));
214107325Siwasaki}
215107325Siwasaki
216123315Snjlsyntax::Expression *syntax::ExpressionStatement::expression() {
21777424Smsmith  return llvm::cast_or_null<syntax::Expression>(
218123315Snjl      findChild(syntax::NodeRole::ExpressionStatement_expression));
219123315Snjl}
220123315Snjl
221123315Snjlsyntax::Leaf *syntax::CompoundStatement::lbrace() {
222123315Snjl  return llvm::cast_or_null<syntax::Leaf>(
223123315Snjl      findChild(syntax::NodeRole::OpenParen));
224123315Snjl}
225123315Snjl
226123315Snjlstd::vector<syntax::Statement *> syntax::CompoundStatement::statements() {
227123315Snjl  std::vector<syntax::Statement *> Children;
228123315Snjl  for (auto *C = firstChild(); C; C = C->nextSibling()) {
229123315Snjl    if (C->role() == syntax::NodeRole::CompoundStatement_statement)
230123315Snjl      Children.push_back(llvm::cast<syntax::Statement>(C));
23177424Smsmith  }
23277424Smsmith  return Children;
23377424Smsmith}
23477424Smsmith
235167802Sjkimsyntax::Leaf *syntax::CompoundStatement::rbrace() {
236167802Sjkim  return llvm::cast_or_null<syntax::Leaf>(
237167802Sjkim      findChild(syntax::NodeRole::CloseParen));
238167802Sjkim}
23977424Smsmith
240138287Smarkssyntax::Expression *syntax::StaticAssertDeclaration::condition() {
241138287Smarks  return llvm::cast_or_null<syntax::Expression>(
242138287Smarks      findChild(syntax::NodeRole::StaticAssertDeclaration_condition));
243138287Smarks}
244138287Smarks
245193267Sjkimsyntax::Expression *syntax::StaticAssertDeclaration::message() {
246138287Smarks  return llvm::cast_or_null<syntax::Expression>(
247138287Smarks      findChild(syntax::NodeRole::StaticAssertDeclaration_message));
248167802Sjkim}
249193267Sjkim