AST.h 37 KB

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