AST.h 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. /*
  2. * Copyright (c) 2021, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/DeprecatedFlyString.h>
  8. #include <AK/DeprecatedString.h>
  9. #include <AK/NonnullRefPtrVector.h>
  10. #include <AK/Optional.h>
  11. #include <AK/RefCounted.h>
  12. #include <AK/StringView.h>
  13. #include <AK/TypeCasts.h>
  14. #include <AK/Vector.h>
  15. #include <LibCpp/Lexer.h>
  16. namespace Cpp {
  17. class ASTNode;
  18. class TranslationUnit;
  19. class Declaration;
  20. class FunctionDefinition;
  21. class Type;
  22. class Parameter;
  23. class Statement;
  24. class Name;
  25. class ASTNode : public RefCounted<ASTNode> {
  26. public:
  27. virtual ~ASTNode() = default;
  28. virtual StringView class_name() const = 0;
  29. virtual void dump(FILE* = stdout, size_t indent = 0) const;
  30. template<typename T>
  31. bool fast_is() const = delete;
  32. ASTNode* parent() const { return m_parent; }
  33. Position start() const
  34. {
  35. VERIFY(m_start.has_value());
  36. return m_start.value();
  37. }
  38. Position end() const
  39. {
  40. VERIFY(m_end.has_value());
  41. return m_end.value();
  42. }
  43. DeprecatedFlyString const& filename() const
  44. {
  45. return m_filename;
  46. }
  47. void set_end(Position const& end) { m_end = end; }
  48. void set_parent(ASTNode& parent) { m_parent = &parent; }
  49. virtual NonnullRefPtrVector<Declaration> declarations() const { return {}; }
  50. virtual bool is_identifier() const { return false; }
  51. virtual bool is_member_expression() const { return false; }
  52. virtual bool is_variable_or_parameter_declaration() const { return false; }
  53. virtual bool is_function_call() const { return false; }
  54. virtual bool is_type() const { return false; }
  55. virtual bool is_declaration() const { return false; }
  56. virtual bool is_name() const { return false; }
  57. virtual bool is_dummy_node() const { return false; }
  58. protected:
  59. ASTNode(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  60. : m_parent(parent)
  61. , m_start(start)
  62. , m_end(end)
  63. , m_filename(filename)
  64. {
  65. }
  66. private:
  67. ASTNode* m_parent { nullptr };
  68. Optional<Position> m_start;
  69. Optional<Position> m_end;
  70. DeprecatedFlyString m_filename;
  71. };
  72. class TranslationUnit : public ASTNode {
  73. public:
  74. virtual ~TranslationUnit() override = default;
  75. virtual StringView class_name() const override { return "TranslationUnit"sv; }
  76. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  77. virtual NonnullRefPtrVector<Declaration> declarations() const override { return m_declarations; }
  78. TranslationUnit(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  79. : ASTNode(parent, start, end, filename)
  80. {
  81. }
  82. void set_declarations(NonnullRefPtrVector<Declaration>&& declarations) { m_declarations = move(declarations); }
  83. private:
  84. NonnullRefPtrVector<Declaration> m_declarations;
  85. };
  86. class Statement : public ASTNode {
  87. public:
  88. virtual ~Statement() override = default;
  89. virtual StringView class_name() const override { return "Statement"sv; }
  90. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  91. protected:
  92. Statement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  93. : ASTNode(parent, start, end, filename)
  94. {
  95. }
  96. };
  97. class Declaration : public Statement {
  98. public:
  99. virtual bool is_declaration() const override { return true; }
  100. virtual bool is_variable_declaration() const { return false; }
  101. virtual bool is_parameter() const { return false; }
  102. virtual bool is_struct_or_class() const { return false; }
  103. virtual bool is_struct() const { return false; }
  104. virtual bool is_class() const { return false; }
  105. virtual bool is_function() const { return false; }
  106. virtual bool is_namespace() const { return false; }
  107. virtual bool is_enum() const { return false; }
  108. bool is_member() const { return parent() != nullptr && parent()->is_declaration() && verify_cast<Declaration>(parent())->is_struct_or_class(); }
  109. Name const* name() const { return m_name; }
  110. StringView full_name() const;
  111. void set_name(RefPtr<Name> name) { m_name = move(name); }
  112. protected:
  113. Declaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  114. : Statement(parent, start, end, filename)
  115. {
  116. }
  117. RefPtr<Name> m_name;
  118. mutable Optional<DeprecatedString> m_full_name;
  119. };
  120. class InvalidDeclaration : public Declaration {
  121. public:
  122. virtual ~InvalidDeclaration() override = default;
  123. virtual StringView class_name() const override { return "InvalidDeclaration"sv; }
  124. InvalidDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  125. : Declaration(parent, start, end, filename)
  126. {
  127. }
  128. };
  129. class FunctionDeclaration : public Declaration {
  130. public:
  131. virtual ~FunctionDeclaration() override = default;
  132. virtual StringView class_name() const override { return "FunctionDeclaration"sv; }
  133. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  134. virtual bool is_function() const override { return true; }
  135. virtual bool is_constructor() const { return false; }
  136. virtual bool is_destructor() const { return false; }
  137. RefPtr<FunctionDefinition> definition() { return m_definition; }
  138. FunctionDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  139. : Declaration(parent, start, end, filename)
  140. {
  141. }
  142. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  143. Vector<StringView> const& qualifiers() const { return m_qualifiers; }
  144. void set_qualifiers(Vector<StringView> const& qualifiers) { m_qualifiers = qualifiers; }
  145. Type const* return_type() const { return m_return_type.ptr(); }
  146. void set_return_type(RefPtr<Type> const& return_type) { m_return_type = return_type; }
  147. NonnullRefPtrVector<Parameter> const& parameters() const { return m_parameters; }
  148. void set_parameters(NonnullRefPtrVector<Parameter> const& parameters) { m_parameters = parameters; }
  149. FunctionDefinition const* definition() const { return m_definition.ptr(); }
  150. void set_definition(RefPtr<FunctionDefinition>&& definition) { m_definition = move(definition); }
  151. private:
  152. Vector<StringView> m_qualifiers;
  153. RefPtr<Type> m_return_type;
  154. NonnullRefPtrVector<Parameter> m_parameters;
  155. RefPtr<FunctionDefinition> m_definition;
  156. };
  157. class VariableOrParameterDeclaration : public Declaration {
  158. public:
  159. virtual ~VariableOrParameterDeclaration() override = default;
  160. virtual bool is_variable_or_parameter_declaration() const override { return true; }
  161. void set_type(RefPtr<Type>&& type) { m_type = move(type); }
  162. Type const* type() const { return m_type.ptr(); }
  163. protected:
  164. VariableOrParameterDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  165. : Declaration(parent, start, end, filename)
  166. {
  167. }
  168. RefPtr<Type> m_type;
  169. };
  170. class Parameter : public VariableOrParameterDeclaration {
  171. public:
  172. virtual ~Parameter() override = default;
  173. virtual StringView class_name() const override { return "Parameter"sv; }
  174. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  175. virtual bool is_parameter() const override { return true; }
  176. Parameter(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, RefPtr<Name> name)
  177. : VariableOrParameterDeclaration(parent, start, end, filename)
  178. {
  179. m_name = name;
  180. }
  181. bool is_ellipsis() const { return m_is_ellipsis; }
  182. void set_ellipsis(bool is_ellipsis) { m_is_ellipsis = is_ellipsis; }
  183. private:
  184. bool m_is_ellipsis { false };
  185. };
  186. class Type : public ASTNode {
  187. public:
  188. virtual ~Type() override = default;
  189. virtual StringView class_name() const override { return "Type"sv; }
  190. virtual bool is_type() const override { return true; }
  191. virtual bool is_templatized() const { return false; }
  192. virtual bool is_named_type() const { return false; }
  193. virtual DeprecatedString to_deprecated_string() const = 0;
  194. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  195. bool is_auto() const { return m_is_auto; }
  196. void set_auto(bool is_auto) { m_is_auto = is_auto; }
  197. Vector<StringView> const& qualifiers() const { return m_qualifiers; }
  198. void set_qualifiers(Vector<StringView>&& qualifiers) { m_qualifiers = move(qualifiers); }
  199. protected:
  200. Type(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  201. : ASTNode(parent, start, end, filename)
  202. {
  203. }
  204. private:
  205. bool m_is_auto { false };
  206. Vector<StringView> m_qualifiers;
  207. };
  208. class NamedType : public Type {
  209. public:
  210. virtual ~NamedType() override = default;
  211. virtual StringView class_name() const override { return "NamedType"sv; }
  212. virtual DeprecatedString to_deprecated_string() const override;
  213. virtual bool is_named_type() const override { return true; }
  214. NamedType(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  215. : Type(parent, start, end, filename)
  216. {
  217. }
  218. Name const* name() const { return m_name.ptr(); }
  219. void set_name(RefPtr<Name>&& name) { m_name = move(name); }
  220. private:
  221. RefPtr<Name> m_name;
  222. };
  223. class Pointer : public Type {
  224. public:
  225. virtual ~Pointer() override = default;
  226. virtual StringView class_name() const override { return "Pointer"sv; }
  227. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  228. virtual DeprecatedString to_deprecated_string() const override;
  229. Pointer(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  230. : Type(parent, start, end, filename)
  231. {
  232. }
  233. Type const* pointee() const { return m_pointee.ptr(); }
  234. void set_pointee(RefPtr<Type>&& pointee) { m_pointee = move(pointee); }
  235. private:
  236. RefPtr<Type> m_pointee;
  237. };
  238. class Reference : public Type {
  239. public:
  240. virtual ~Reference() override = default;
  241. virtual StringView class_name() const override { return "Reference"sv; }
  242. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  243. virtual DeprecatedString to_deprecated_string() const override;
  244. enum class Kind {
  245. Lvalue,
  246. Rvalue,
  247. };
  248. Reference(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, Kind kind)
  249. : Type(parent, start, end, filename)
  250. , m_kind(kind)
  251. {
  252. }
  253. Type const* referenced_type() const { return m_referenced_type.ptr(); }
  254. void set_referenced_type(RefPtr<Type>&& pointee) { m_referenced_type = move(pointee); }
  255. Kind kind() const { return m_kind; }
  256. private:
  257. RefPtr<Type const> m_referenced_type;
  258. Kind m_kind;
  259. };
  260. class FunctionType : public Type {
  261. public:
  262. virtual ~FunctionType() override = default;
  263. virtual StringView class_name() const override { return "FunctionType"sv; }
  264. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  265. virtual DeprecatedString to_deprecated_string() const override;
  266. FunctionType(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  267. : Type(parent, start, end, filename)
  268. {
  269. }
  270. void set_return_type(Type& type) { m_return_type = type; }
  271. void set_parameters(NonnullRefPtrVector<Parameter> parameters) { m_parameters = move(parameters); }
  272. private:
  273. RefPtr<Type> m_return_type;
  274. NonnullRefPtrVector<Parameter> m_parameters;
  275. };
  276. class FunctionDefinition : public ASTNode {
  277. public:
  278. virtual ~FunctionDefinition() override = default;
  279. virtual StringView class_name() const override { return "FunctionDefinition"sv; }
  280. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  281. FunctionDefinition(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  282. : ASTNode(parent, start, end, filename)
  283. {
  284. }
  285. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  286. NonnullRefPtrVector<Statement> const& statements() { return m_statements; }
  287. void add_statement(NonnullRefPtr<Statement>&& statement) { m_statements.append(move(statement)); }
  288. private:
  289. NonnullRefPtrVector<Statement> m_statements;
  290. };
  291. class InvalidStatement : public Statement {
  292. public:
  293. virtual ~InvalidStatement() override = default;
  294. virtual StringView class_name() const override { return "InvalidStatement"sv; }
  295. InvalidStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  296. : Statement(parent, start, end, filename)
  297. {
  298. }
  299. };
  300. class Expression : public Statement {
  301. public:
  302. virtual ~Expression() override = default;
  303. virtual StringView class_name() const override { return "Expression"sv; }
  304. protected:
  305. Expression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  306. : Statement(parent, start, end, filename)
  307. {
  308. }
  309. };
  310. class InvalidExpression : public Expression {
  311. public:
  312. virtual ~InvalidExpression() override = default;
  313. virtual StringView class_name() const override { return "InvalidExpression"sv; }
  314. InvalidExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  315. : Expression(parent, start, end, filename)
  316. {
  317. }
  318. };
  319. class VariableDeclaration : public VariableOrParameterDeclaration {
  320. public:
  321. virtual ~VariableDeclaration() override = default;
  322. virtual StringView class_name() const override { return "VariableDeclaration"sv; }
  323. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  324. VariableDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  325. : VariableOrParameterDeclaration(parent, start, end, filename)
  326. {
  327. }
  328. virtual bool is_variable_declaration() const override { return true; }
  329. Expression const* initial_value() const { return m_initial_value; }
  330. void set_initial_value(RefPtr<Expression>&& initial_value) { m_initial_value = move(initial_value); }
  331. private:
  332. RefPtr<Expression> m_initial_value;
  333. };
  334. class Identifier : public Expression {
  335. public:
  336. virtual ~Identifier() override = default;
  337. virtual StringView class_name() const override { return "Identifier"sv; }
  338. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  339. Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, StringView name)
  340. : Expression(parent, start, end, filename)
  341. , m_name(name)
  342. {
  343. }
  344. Identifier(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  345. : Identifier(parent, start, end, filename, {})
  346. {
  347. }
  348. virtual bool is_identifier() const override { return true; }
  349. StringView name() const { return m_name; }
  350. void set_name(StringView&& name) { m_name = move(name); }
  351. private:
  352. StringView m_name;
  353. };
  354. class Name : public Expression {
  355. public:
  356. virtual ~Name() override = default;
  357. virtual StringView class_name() const override { return "Name"sv; }
  358. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  359. virtual bool is_name() const override { return true; }
  360. virtual bool is_templatized() const { return false; }
  361. Name(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  362. : Expression(parent, start, end, filename)
  363. {
  364. }
  365. virtual StringView full_name() const;
  366. Identifier const* name() const { return m_name.ptr(); }
  367. void set_name(RefPtr<Identifier>&& name) { m_name = move(name); }
  368. NonnullRefPtrVector<Identifier> const& scope() const { return m_scope; }
  369. void set_scope(NonnullRefPtrVector<Identifier> scope) { m_scope = move(scope); }
  370. void add_to_scope(NonnullRefPtr<Identifier>&& part) { m_scope.append(move(part)); }
  371. private:
  372. RefPtr<Identifier> m_name;
  373. NonnullRefPtrVector<Identifier> m_scope;
  374. mutable Optional<DeprecatedString> m_full_name;
  375. };
  376. class TemplatizedName : public Name {
  377. public:
  378. virtual ~TemplatizedName() override = default;
  379. virtual StringView class_name() const override { return "TemplatizedName"sv; }
  380. virtual bool is_templatized() const override { return true; }
  381. virtual StringView full_name() const override;
  382. TemplatizedName(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  383. : Name(parent, start, end, filename)
  384. {
  385. }
  386. void add_template_argument(NonnullRefPtr<Type>&& type) { m_template_arguments.append(move(type)); }
  387. private:
  388. NonnullRefPtrVector<Type> m_template_arguments;
  389. mutable Optional<DeprecatedString> m_full_name;
  390. };
  391. class NumericLiteral : public Expression {
  392. public:
  393. virtual ~NumericLiteral() override = default;
  394. virtual StringView class_name() const override { return "NumericLiteral"sv; }
  395. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  396. NumericLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, StringView value)
  397. : Expression(parent, start, end, filename)
  398. , m_value(value)
  399. {
  400. }
  401. private:
  402. StringView m_value;
  403. };
  404. class NullPointerLiteral : public Expression {
  405. public:
  406. virtual ~NullPointerLiteral() override = default;
  407. virtual StringView class_name() const override { return "NullPointerLiteral"sv; }
  408. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  409. NullPointerLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  410. : Expression(parent, start, end, filename)
  411. {
  412. }
  413. };
  414. class BooleanLiteral : public Expression {
  415. public:
  416. virtual ~BooleanLiteral() override = default;
  417. virtual StringView class_name() const override { return "BooleanLiteral"sv; }
  418. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  419. BooleanLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, bool value)
  420. : Expression(parent, start, end, filename)
  421. , m_value(value)
  422. {
  423. }
  424. private:
  425. bool m_value;
  426. };
  427. enum class BinaryOp {
  428. Addition,
  429. Subtraction,
  430. Multiplication,
  431. Division,
  432. Modulo,
  433. GreaterThan,
  434. GreaterThanEquals,
  435. LessThan,
  436. LessThanEquals,
  437. BitwiseAnd,
  438. BitwiseOr,
  439. BitwiseXor,
  440. LeftShift,
  441. RightShift,
  442. EqualsEquals,
  443. NotEqual,
  444. LogicalOr,
  445. LogicalAnd,
  446. Arrow,
  447. };
  448. class BinaryExpression : public Expression {
  449. public:
  450. BinaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  451. : Expression(parent, start, end, filename)
  452. {
  453. }
  454. virtual ~BinaryExpression() override = default;
  455. virtual StringView class_name() const override { return "BinaryExpression"sv; }
  456. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  457. BinaryOp op() const { return m_op; }
  458. void set_op(BinaryOp op) { m_op = op; }
  459. Expression const* lhs() const { return m_lhs.ptr(); }
  460. void set_lhs(RefPtr<Expression>&& e) { m_lhs = move(e); }
  461. Expression const* rhs() const { return m_rhs.ptr(); }
  462. void set_rhs(RefPtr<Expression>&& e) { m_rhs = move(e); }
  463. private:
  464. BinaryOp m_op;
  465. RefPtr<Expression> m_lhs;
  466. RefPtr<Expression> m_rhs;
  467. };
  468. enum class AssignmentOp {
  469. Assignment,
  470. AdditionAssignment,
  471. SubtractionAssignment,
  472. };
  473. class AssignmentExpression : public Expression {
  474. public:
  475. AssignmentExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  476. : Expression(parent, start, end, filename)
  477. {
  478. }
  479. virtual ~AssignmentExpression() override = default;
  480. virtual StringView class_name() const override { return "AssignmentExpression"sv; }
  481. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  482. AssignmentOp op() const { return m_op; }
  483. void set_op(AssignmentOp op) { m_op = op; }
  484. Expression const* lhs() const { return m_lhs; }
  485. void set_lhs(RefPtr<Expression>&& e) { m_lhs = move(e); }
  486. Expression const* rhs() const { return m_rhs; }
  487. void set_rhs(RefPtr<Expression>&& e) { m_rhs = move(e); }
  488. private:
  489. AssignmentOp m_op {};
  490. RefPtr<Expression> m_lhs;
  491. RefPtr<Expression> m_rhs;
  492. };
  493. class FunctionCall : public Expression {
  494. public:
  495. FunctionCall(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  496. : Expression(parent, start, end, filename)
  497. {
  498. }
  499. virtual ~FunctionCall() override = default;
  500. virtual StringView class_name() const override { return "FunctionCall"sv; }
  501. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  502. virtual bool is_function_call() const override { return true; }
  503. Expression const* callee() const { return m_callee.ptr(); }
  504. void set_callee(RefPtr<Expression>&& callee) { m_callee = move(callee); }
  505. void add_argument(NonnullRefPtr<Expression>&& arg) { m_arguments.append(move(arg)); }
  506. NonnullRefPtrVector<Expression> const& arguments() const { return m_arguments; }
  507. private:
  508. RefPtr<Expression> m_callee;
  509. NonnullRefPtrVector<Expression> m_arguments;
  510. };
  511. class StringLiteral final : public Expression {
  512. public:
  513. StringLiteral(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  514. : Expression(parent, start, end, filename)
  515. {
  516. }
  517. ~StringLiteral() override = default;
  518. virtual StringView class_name() const override { return "StringLiteral"sv; }
  519. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  520. DeprecatedString const& value() const { return m_value; }
  521. void set_value(DeprecatedString value) { m_value = move(value); }
  522. private:
  523. DeprecatedString m_value;
  524. };
  525. class ReturnStatement : public Statement {
  526. public:
  527. virtual ~ReturnStatement() override = default;
  528. virtual StringView class_name() const override { return "ReturnStatement"sv; }
  529. ReturnStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  530. : Statement(parent, start, end, filename)
  531. {
  532. }
  533. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  534. Expression const* value() const { return m_value.ptr(); }
  535. void set_value(RefPtr<Expression>&& value) { m_value = move(value); }
  536. private:
  537. RefPtr<Expression> m_value;
  538. };
  539. class EnumDeclaration : public Declaration {
  540. public:
  541. virtual ~EnumDeclaration() override = default;
  542. virtual StringView class_name() const override { return "EnumDeclaration"sv; }
  543. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  544. virtual bool is_enum() const override { return true; }
  545. EnumDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  546. : Declaration(parent, start, end, filename)
  547. {
  548. }
  549. enum class Type {
  550. RegularEnum,
  551. EnumClass
  552. };
  553. void set_type(Type type) { m_type = type; }
  554. void add_entry(StringView entry, RefPtr<Expression> value = nullptr) { m_entries.append({ entry, move(value) }); }
  555. private:
  556. Type m_type { Type::RegularEnum };
  557. struct EnumerationEntry {
  558. StringView name;
  559. RefPtr<Expression> value;
  560. };
  561. Vector<EnumerationEntry> m_entries;
  562. };
  563. class StructOrClassDeclaration : public Declaration {
  564. public:
  565. virtual ~StructOrClassDeclaration() override = default;
  566. virtual StringView class_name() const override { return "StructOrClassDeclaration"sv; }
  567. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  568. virtual bool is_struct_or_class() const override { return true; }
  569. virtual bool is_struct() const override { return m_type == Type::Struct; }
  570. virtual bool is_class() const override { return m_type == Type::Class; }
  571. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  572. enum class Type {
  573. Struct,
  574. Class
  575. };
  576. StructOrClassDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename, StructOrClassDeclaration::Type type)
  577. : Declaration(parent, start, end, filename)
  578. , m_type(type)
  579. {
  580. }
  581. NonnullRefPtrVector<Declaration> const& members() const { return m_members; }
  582. void set_members(NonnullRefPtrVector<Declaration>&& members) { m_members = move(members); }
  583. NonnullRefPtrVector<Name> const& baseclasses() const { return m_baseclasses; }
  584. void set_baseclasses(NonnullRefPtrVector<Name>&& baseclasses) { m_baseclasses = move(baseclasses); }
  585. private:
  586. StructOrClassDeclaration::Type m_type;
  587. NonnullRefPtrVector<Declaration> m_members;
  588. NonnullRefPtrVector<Name> m_baseclasses;
  589. };
  590. enum class UnaryOp {
  591. Invalid,
  592. BitwiseNot,
  593. Not,
  594. Plus,
  595. Minus,
  596. PlusPlus,
  597. Address,
  598. };
  599. class UnaryExpression : public Expression {
  600. public:
  601. UnaryExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  602. : Expression(parent, start, end, filename)
  603. {
  604. }
  605. virtual ~UnaryExpression() override = default;
  606. virtual StringView class_name() const override { return "UnaryExpression"sv; }
  607. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  608. void set_op(UnaryOp op) { m_op = op; }
  609. void set_lhs(RefPtr<Expression>&& e) { m_lhs = move(e); }
  610. private:
  611. UnaryOp m_op;
  612. RefPtr<Expression> m_lhs;
  613. };
  614. class MemberExpression : public Expression {
  615. public:
  616. MemberExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  617. : Expression(parent, start, end, filename)
  618. {
  619. }
  620. virtual ~MemberExpression() override = default;
  621. virtual StringView class_name() const override { return "MemberExpression"sv; }
  622. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  623. virtual bool is_member_expression() const override { return true; }
  624. Expression const* object() const { return m_object.ptr(); }
  625. void set_object(RefPtr<Expression>&& object) { m_object = move(object); }
  626. Expression const* property() const { return m_property.ptr(); }
  627. void set_property(RefPtr<Expression>&& property) { m_property = move(property); }
  628. private:
  629. RefPtr<Expression> m_object;
  630. RefPtr<Expression> m_property;
  631. };
  632. class ForStatement : public Statement {
  633. public:
  634. ForStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  635. : Statement(parent, start, end, filename)
  636. {
  637. }
  638. virtual ~ForStatement() override = default;
  639. virtual StringView class_name() const override { return "ForStatement"sv; }
  640. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  641. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  642. void set_init(RefPtr<VariableDeclaration>&& init) { m_init = move(init); }
  643. void set_test(RefPtr<Expression>&& test) { m_test = move(test); }
  644. void set_update(RefPtr<Expression>&& update) { m_update = move(update); }
  645. void set_body(RefPtr<Statement>&& body) { m_body = move(body); }
  646. Statement const* body() const { return m_body.ptr(); }
  647. private:
  648. RefPtr<VariableDeclaration> m_init;
  649. RefPtr<Expression> m_test;
  650. RefPtr<Expression> m_update;
  651. RefPtr<Statement> m_body;
  652. };
  653. class BlockStatement final : public Statement {
  654. public:
  655. BlockStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  656. : Statement(parent, start, end, filename)
  657. {
  658. }
  659. virtual ~BlockStatement() override = default;
  660. virtual StringView class_name() const override { return "BlockStatement"sv; }
  661. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  662. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  663. void add_statement(NonnullRefPtr<Statement>&& statement) { m_statements.append(move(statement)); }
  664. private:
  665. NonnullRefPtrVector<Statement> m_statements;
  666. };
  667. class Comment final : public Statement {
  668. public:
  669. Comment(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  670. : Statement(parent, start, end, filename)
  671. {
  672. }
  673. virtual ~Comment() override = default;
  674. virtual StringView class_name() const override { return "Comment"sv; }
  675. };
  676. class IfStatement : public Statement {
  677. public:
  678. IfStatement(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  679. : Statement(parent, start, end, filename)
  680. {
  681. }
  682. virtual ~IfStatement() override = default;
  683. virtual StringView class_name() const override { return "IfStatement"sv; }
  684. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  685. virtual NonnullRefPtrVector<Declaration> declarations() const override;
  686. void set_predicate(RefPtr<Expression>&& predicate) { m_predicate = move(predicate); }
  687. void set_then_statement(RefPtr<Statement>&& then) { m_then = move(then); }
  688. void set_else_statement(RefPtr<Statement>&& _else) { m_else = move(_else); }
  689. Statement const* then_statement() const { return m_then.ptr(); }
  690. Statement const* else_statement() const { return m_else.ptr(); }
  691. private:
  692. RefPtr<Expression> m_predicate;
  693. RefPtr<Statement> m_then;
  694. RefPtr<Statement> m_else;
  695. };
  696. class NamespaceDeclaration : public Declaration {
  697. public:
  698. virtual ~NamespaceDeclaration() override = default;
  699. virtual StringView class_name() const override { return "NamespaceDeclaration"sv; }
  700. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  701. virtual bool is_namespace() const override { return true; }
  702. NamespaceDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  703. : Declaration(parent, start, end, filename)
  704. {
  705. }
  706. virtual NonnullRefPtrVector<Declaration> declarations() const override { return m_declarations; }
  707. void add_declaration(NonnullRefPtr<Declaration>&& declaration) { m_declarations.append(move(declaration)); }
  708. private:
  709. NonnullRefPtrVector<Declaration> m_declarations;
  710. };
  711. class CppCastExpression : public Expression {
  712. public:
  713. CppCastExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  714. : Expression(parent, start, end, filename)
  715. {
  716. }
  717. virtual ~CppCastExpression() override = default;
  718. virtual StringView class_name() const override { return "CppCastExpression"sv; }
  719. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  720. void set_cast_type(StringView cast_type) { m_cast_type = move(cast_type); }
  721. void set_type(NonnullRefPtr<Type>&& type) { m_type = move(type); }
  722. void set_expression(NonnullRefPtr<Expression>&& e) { m_expression = move(e); }
  723. private:
  724. StringView m_cast_type;
  725. RefPtr<Type> m_type;
  726. RefPtr<Expression> m_expression;
  727. };
  728. class CStyleCastExpression : public Expression {
  729. public:
  730. CStyleCastExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  731. : Expression(parent, start, end, filename)
  732. {
  733. }
  734. virtual ~CStyleCastExpression() override = default;
  735. virtual StringView class_name() const override { return "CStyleCastExpression"sv; }
  736. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  737. void set_type(NonnullRefPtr<Type>&& type) { m_type = move(type); }
  738. void set_expression(NonnullRefPtr<Expression>&& e) { m_expression = move(e); }
  739. private:
  740. RefPtr<Type> m_type;
  741. RefPtr<Expression> m_expression;
  742. };
  743. class SizeofExpression : public Expression {
  744. public:
  745. SizeofExpression(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  746. : Expression(parent, start, end, filename)
  747. {
  748. }
  749. virtual ~SizeofExpression() override = default;
  750. virtual StringView class_name() const override { return "SizeofExpression"sv; }
  751. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  752. void set_type(RefPtr<Type>&& type) { m_type = move(type); }
  753. private:
  754. RefPtr<Type> m_type;
  755. };
  756. class BracedInitList : public Expression {
  757. public:
  758. BracedInitList(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  759. : Expression(parent, start, end, filename)
  760. {
  761. }
  762. virtual ~BracedInitList() override = default;
  763. virtual StringView class_name() const override { return "BracedInitList"sv; }
  764. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  765. void add_expression(NonnullRefPtr<Expression>&& exp) { m_expressions.append(move(exp)); }
  766. private:
  767. NonnullRefPtrVector<Expression> m_expressions;
  768. };
  769. class DummyAstNode : public ASTNode {
  770. public:
  771. DummyAstNode(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  772. : ASTNode(parent, start, end, filename)
  773. {
  774. }
  775. virtual bool is_dummy_node() const override { return true; }
  776. virtual StringView class_name() const override { return "DummyAstNode"sv; }
  777. virtual void dump(FILE* = stdout, size_t = 0) const override { }
  778. };
  779. class Constructor : public FunctionDeclaration {
  780. public:
  781. virtual ~Constructor() override = default;
  782. virtual StringView class_name() const override { return "Constructor"sv; }
  783. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  784. virtual bool is_constructor() const override { return true; }
  785. Constructor(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  786. : FunctionDeclaration(parent, start, end, filename)
  787. {
  788. }
  789. };
  790. class Destructor : public FunctionDeclaration {
  791. public:
  792. virtual ~Destructor() override = default;
  793. virtual StringView class_name() const override { return "Destructor"sv; }
  794. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  795. virtual bool is_destructor() const override { return true; }
  796. Destructor(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  797. : FunctionDeclaration(parent, start, end, filename)
  798. {
  799. }
  800. };
  801. class UsingNamespaceDeclaration : public Declaration {
  802. public:
  803. virtual ~UsingNamespaceDeclaration() override = default;
  804. virtual StringView class_name() const override { return "UsingNamespaceDeclaration"sv; }
  805. virtual void dump(FILE* = stdout, size_t indent = 0) const override;
  806. UsingNamespaceDeclaration(ASTNode* parent, Optional<Position> start, Optional<Position> end, DeprecatedString const& filename)
  807. : Declaration(parent, start, end, filename)
  808. {
  809. }
  810. };
  811. template<>
  812. inline bool ASTNode::fast_is<Identifier>() const { return is_identifier(); }
  813. template<>
  814. inline bool ASTNode::fast_is<MemberExpression>() const { return is_member_expression(); }
  815. template<>
  816. inline bool ASTNode::fast_is<VariableOrParameterDeclaration>() const { return is_variable_or_parameter_declaration(); }
  817. template<>
  818. inline bool ASTNode::fast_is<FunctionCall>() const { return is_function_call(); }
  819. template<>
  820. inline bool ASTNode::fast_is<Type>() const { return is_type(); }
  821. template<>
  822. inline bool ASTNode::fast_is<Declaration>() const { return is_declaration(); }
  823. template<>
  824. inline bool ASTNode::fast_is<Name>() const { return is_name(); }
  825. template<>
  826. inline bool ASTNode::fast_is<DummyAstNode>() const { return is_dummy_node(); }
  827. template<>
  828. inline bool ASTNode::fast_is<VariableDeclaration>() const { return is_declaration() && verify_cast<Declaration>(*this).is_variable_declaration(); }
  829. template<>
  830. inline bool ASTNode::fast_is<StructOrClassDeclaration>() const { return is_declaration() && verify_cast<Declaration>(*this).is_struct_or_class(); }
  831. template<>
  832. inline bool ASTNode::fast_is<FunctionDeclaration>() const { return is_declaration() && verify_cast<Declaration>(*this).is_function(); }
  833. template<>
  834. inline bool ASTNode::fast_is<NamespaceDeclaration>() const { return is_declaration() && verify_cast<Declaration>(*this).is_namespace(); }
  835. template<>
  836. inline bool ASTNode::fast_is<Constructor>() const { return is_declaration() && verify_cast<Declaration>(*this).is_function() && verify_cast<FunctionDeclaration>(*this).is_constructor(); }
  837. template<>
  838. inline bool ASTNode::fast_is<Destructor>() const { return is_declaration() && verify_cast<Declaration>(*this).is_function() && verify_cast<FunctionDeclaration>(*this).is_destructor(); }
  839. template<>
  840. inline bool ASTNode::fast_is<NamedType>() const { return is_type() && verify_cast<Type>(*this).is_named_type(); }
  841. template<>
  842. inline bool ASTNode::fast_is<TemplatizedName>() const { return is_name() && verify_cast<Name>(*this).is_templatized(); }
  843. }