clang: lib/Tooling/Syntax/Nodes.cpp Source File (original) (raw)

1

2

3

4

5

6

7

9#include "llvm/Support/raw_ostream.h"

10

11using namespace clang;

12

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

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

108

109std::vector<syntax::NameSpecifier *>

112 std::vector<syntax::NameSpecifier *> Children;

113 for (const auto &Element : SpecifiersAsNodes) {

114 Children.push_back(llvm::castsyntax::NameSpecifier(Element));

115 }

116 return Children;

117}

118

119std::vector<syntax::List::ElementAndDelimitersyntax::NameSpecifier>

121 auto SpecifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters();

122 std::vector<syntax::List::ElementAndDelimitersyntax::NameSpecifier>

123 Children;

124 for (const auto &SpecifierAndDoubleColon : SpecifiersAsNodesAndDoubleColons) {

125 Children.push_back(

126 {llvm::castsyntax::NameSpecifier(SpecifierAndDoubleColon.element),

127 SpecifierAndDoubleColon.delimiter});

128 }

129 return Children;

130}

131

133 auto ArgumentsAsNodes = getElementsAsNodes();

134 std::vector<syntax::Expression *> Children;

135 for (const auto &ArgumentAsNode : ArgumentsAsNodes) {

136 Children.push_back(llvm::castsyntax::Expression(ArgumentAsNode));

137 }

138 return Children;

139}

140

141std::vector<syntax::List::ElementAndDelimitersyntax::Expression>

143 auto ArgumentsAsNodesAndCommas = getElementsAsNodesAndDelimiters();

144 std::vector<syntax::List::ElementAndDelimitersyntax::Expression> Children;

145 for (const auto &ArgumentAsNodeAndComma : ArgumentsAsNodesAndCommas) {

146 Children.push_back(

147 {llvm::castsyntax::Expression(ArgumentAsNodeAndComma.element),

148 ArgumentAsNodeAndComma.delimiter});

149 }

150 return Children;

151}

152

153std::vector<syntax::SimpleDeclaration *>

155 auto ParametersAsNodes = getElementsAsNodes();

156 std::vector<syntax::SimpleDeclaration *> Children;

157 for (const auto &ParameterAsNode : ParametersAsNodes) {

158 Children.push_back(llvm::castsyntax::SimpleDeclaration(ParameterAsNode));

159 }

160 return Children;

161}

162

163std::vector<syntax::List::ElementAndDelimitersyntax::SimpleDeclaration>

165 auto ParametersAsNodesAndCommas = getElementsAsNodesAndDelimiters();

166 std::vector<syntax::List::ElementAndDelimitersyntax::SimpleDeclaration>

167 Children;

168 for (const auto &ParameterAsNodeAndComma : ParametersAsNodesAndCommas) {

169 Children.push_back(

170 {llvm::castsyntax::SimpleDeclaration(ParameterAsNodeAndComma.element),

171 ParameterAsNodeAndComma.delimiter});

172 }

173 return Children;

174}

175

176std::vector<syntax::SimpleDeclarator *>

178 auto DeclaratorsAsNodes = getElementsAsNodes();

179 std::vector<syntax::SimpleDeclarator *> Children;

180 for (const auto &DeclaratorAsNode : DeclaratorsAsNodes) {

181 Children.push_back(llvm::castsyntax::SimpleDeclarator(DeclaratorAsNode));

182 }

183 return Children;

184}

185

186std::vector<syntax::List::ElementAndDelimitersyntax::SimpleDeclarator>

188 auto DeclaratorsAsNodesAndCommas = getElementsAsNodesAndDelimiters();

189 std::vector<syntax::List::ElementAndDelimitersyntax::SimpleDeclarator>

190 Children;

191 for (const auto &DeclaratorAsNodeAndComma : DeclaratorsAsNodesAndCommas) {

192 Children.push_back(

193 {llvm::castsyntax::SimpleDeclarator(DeclaratorAsNodeAndComma.element),

194 DeclaratorAsNodeAndComma.delimiter});

195 }

196 return Children;

197}

198

200 return cast_or_nullsyntax::Expression(

202}

203

206}

207

210}

211

214}

215

217 return cast_or_nullsyntax::Expression(

219}

220

222 return cast_or_nullsyntax::Leaf(

224}

225

227 return cast_or_nullsyntax::Statement(

229}

230

232 return cast_or_nullsyntax::Leaf(

234}

235

237 return cast_or_nullsyntax::Expression(

239}

240

242 return cast_or_nullsyntax::Statement(

244}

245

247 return cast_or_nullsyntax::Leaf(

249}

250

252 return cast_or_nullsyntax::Statement(

254}

255

257 return cast_or_nullsyntax::Leaf(

259}

260

262 return cast_or_nullsyntax::Statement(

264}

265

268}

269

271 return cast_or_nullsyntax::Statement(

273}

274

276 return cast_or_nullsyntax::Leaf(

278}

279

281 return cast_or_nullsyntax::Statement(

283}

284

286 return cast_or_nullsyntax::Leaf(

288}

289

291 return cast_or_nullsyntax::Statement(

293}

294

296 return cast_or_nullsyntax::Leaf(

298}

299

301 return cast_or_nullsyntax::Leaf(

303}

304

306 return cast_or_nullsyntax::Leaf(

308}

309

311 return cast_or_nullsyntax::Expression(

313}

314

316 return cast_or_nullsyntax::Leaf(

318}

319

321 return cast_or_nullsyntax::Statement(

323}

324

326 return cast_or_nullsyntax::Expression(

328}

329

332}

333

335 std::vector<syntax::Statement *> Children;

336 for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {

338 Children.push_back(castsyntax::Statement(C));

339 }

340 return Children;

341}

342

345}

346

348 return cast_or_nullsyntax::Expression(

350}

351

354}

355

356std::vector<syntax::SimpleDeclarator *>

358 std::vector<syntax::SimpleDeclarator *> Children;

359 for (auto *C = getFirstChild(); C; C = C->getNextSibling()) {

361 Children.push_back(castsyntax::SimpleDeclarator(C));

362 }

363 return Children;

364}

365

367 return cast_or_nullsyntax::Leaf(

369}

370

372 return cast_or_nullsyntax::Declaration(

374}

375

377 return cast_or_nullsyntax::Leaf(

379}

380

383}

384

386 return cast_or_nullsyntax::Declaration(

388}

389

392}

393

396}

397

400}

401

404}

405

408}

409

412}

413

415 return cast_or_nullsyntax::SimpleDeclarator(

417}

418

421}

422

425 return cast_or_nullsyntax::ParameterDeclarationList(

427}

428

431}

432

435 return cast_or_nullsyntax::TrailingReturnType(

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"

Leaf * getOperatorToken()

std::vector< List::ElementAndDelimiter< Expression > > getArgumentsAndCommas()

std::vector< Expression * > getArguments()

Expression * getCaseValue()

std::vector< Statement * > getStatements()

FIXME: use custom iterator instead of 'vector'.

Leaf * getContinueKeyword()

A declaration that can appear at the top-level.

std::vector< SimpleDeclarator * > getDeclarators()

std::vector< List::ElementAndDelimiter< syntax::SimpleDeclarator > > getDeclaratorsAndCommas()

Leaf * getDefaultKeyword()

Leaf * getExternKeyword()

Leaf * getTemplateKeyword()

Declaration * getDeclaration()

Expression * getExpression()

Statement * getThenStatement()

Statement * getElseStatement()

A leaf node points to a single token.

std::vector< Node * > getElementsAsNodes()

Returns the elements of the list.

std::vector< NameSpecifier * > getSpecifiers()

std::vector< List::ElementAndDelimiter< syntax::NameSpecifier > > getSpecifiersAndDoubleColons()

Models a parameter-declaration-list which appears within parameters-and-qualifiers.

std::vector< List::ElementAndDelimiter< syntax::SimpleDeclaration > > getParametersAndCommas()

std::vector< SimpleDeclaration * > getParameterDeclarations()

ParameterDeclarationList * getParameters()

TrailingReturnType * getTrailingReturn()

Leaf * getReturnKeyword()

Expression * getReturnValue()

std::vector< SimpleDeclarator * > getDeclarators()

FIXME: use custom iterator instead of 'vector'.

A top-level declarator without parentheses.

An abstract node for C++ statements, e.g.

Expression * getMessage()

Expression * getCondition()

Leaf * getSwitchKeyword()

Leaf * getTemplateKeyword()

Declaration * getDeclaration()

Trailing return type after the parameter list, including the arrow token.

SimpleDeclarator * getDeclarator()

Expression * getOperand()

Leaf * getOperatorToken()

NodeRole

A relation between a parent and child node, e.g.

@ CloseParen

A closing parenthesis in argument lists and blocks, e.g. '}', ')', etc.

@ IntroducerKeyword

A keywords that introduces some grammar construct, e.g. 'if', 'try', etc.

@ BodyStatement

An inner statement for those that have only a single child of kind statement, e.g.

@ OpenParen

An opening parenthesis in argument lists and blocks, e.g. '{', '(', etc.

@ ArrowToken

Tokens or Keywords.

NodeKind

A kind of a syntax node, used for implementing casts.

raw_ostream & operator<<(raw_ostream &OS, NodeKind K)

For debugging purposes.

The JSON file list parser is used to communicate input to InstallAPI.