AST.h 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2020, Linus Groh <mail@linusgroh.de>
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form must reproduce the above copyright notice,
  13. * this list of conditions and the following disclaimer in the documentation
  14. * and/or other materials provided with the distribution.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  20. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #pragma once
  28. #include <AK/FlyString.h>
  29. #include <AK/HashMap.h>
  30. #include <AK/NonnullRefPtrVector.h>
  31. #include <AK/RefPtr.h>
  32. #include <AK/String.h>
  33. #include <AK/Vector.h>
  34. #include <LibJS/Forward.h>
  35. #include <LibJS/Runtime/PropertyName.h>
  36. #include <LibJS/Runtime/Value.h>
  37. namespace JS {
  38. class VariableDeclaration;
  39. class FunctionDeclaration;
  40. template<class T, class... Args>
  41. static inline NonnullRefPtr<T>
  42. create_ast_node(Args&&... args)
  43. {
  44. return adopt(*new T(forward<Args>(args)...));
  45. }
  46. class ASTNode : public RefCounted<ASTNode> {
  47. public:
  48. virtual ~ASTNode() { }
  49. virtual const char* class_name() const = 0;
  50. virtual Value execute(Interpreter&, GlobalObject&) const = 0;
  51. virtual void dump(int indent) const;
  52. virtual bool is_identifier() const { return false; }
  53. virtual bool is_spread_expression() const { return false; }
  54. virtual bool is_member_expression() const { return false; }
  55. virtual bool is_scope_node() const { return false; }
  56. virtual bool is_program() const { return false; }
  57. virtual bool is_variable_declaration() const { return false; }
  58. virtual bool is_call_expression() const { return false; }
  59. virtual bool is_new_expression() const { return false; }
  60. virtual bool is_super_expression() const { return false; }
  61. protected:
  62. ASTNode() { }
  63. private:
  64. };
  65. class Statement : public ASTNode {
  66. public:
  67. const FlyString& label() const { return m_label; }
  68. void set_label(FlyString string) { m_label = string; }
  69. protected:
  70. FlyString m_label;
  71. };
  72. class EmptyStatement final : public Statement {
  73. public:
  74. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  75. const char* class_name() const override { return "EmptyStatement"; }
  76. };
  77. class ErrorStatement final : public Statement {
  78. public:
  79. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  80. const char* class_name() const override { return "ErrorStatement"; }
  81. };
  82. class ExpressionStatement final : public Statement {
  83. public:
  84. ExpressionStatement(NonnullRefPtr<Expression> expression)
  85. : m_expression(move(expression))
  86. {
  87. }
  88. Value execute(Interpreter&, GlobalObject&) const override;
  89. const char* class_name() const override { return "ExpressionStatement"; }
  90. virtual void dump(int indent) const override;
  91. private:
  92. NonnullRefPtr<Expression> m_expression;
  93. };
  94. class ScopeNode : public Statement {
  95. public:
  96. template<typename T, typename... Args>
  97. T& append(Args&&... args)
  98. {
  99. auto child = create_ast_node<T>(forward<Args>(args)...);
  100. m_children.append(move(child));
  101. return static_cast<T&>(m_children.last());
  102. }
  103. void append(NonnullRefPtr<Statement> child)
  104. {
  105. m_children.append(move(child));
  106. }
  107. const NonnullRefPtrVector<Statement>& children() const { return m_children; }
  108. virtual Value execute(Interpreter&, GlobalObject&) const override;
  109. virtual void dump(int indent) const override;
  110. void add_variables(NonnullRefPtrVector<VariableDeclaration>);
  111. void add_functions(NonnullRefPtrVector<FunctionDeclaration>);
  112. const NonnullRefPtrVector<VariableDeclaration>& variables() const { return m_variables; }
  113. const NonnullRefPtrVector<FunctionDeclaration>& functions() const { return m_functions; }
  114. bool in_strict_mode() const { return m_strict_mode; }
  115. void set_strict_mode() { m_strict_mode = true; }
  116. protected:
  117. ScopeNode() { }
  118. private:
  119. virtual bool is_scope_node() const final { return true; }
  120. NonnullRefPtrVector<Statement> m_children;
  121. NonnullRefPtrVector<VariableDeclaration> m_variables;
  122. NonnullRefPtrVector<FunctionDeclaration> m_functions;
  123. bool m_strict_mode { false };
  124. };
  125. class Program : public ScopeNode {
  126. public:
  127. Program() { }
  128. private:
  129. virtual bool is_program() const override { return true; }
  130. virtual const char* class_name() const override { return "Program"; }
  131. };
  132. class BlockStatement : public ScopeNode {
  133. public:
  134. BlockStatement() { }
  135. private:
  136. virtual const char* class_name() const override { return "BlockStatement"; }
  137. };
  138. class Expression : public ASTNode {
  139. public:
  140. virtual Reference to_reference(Interpreter&, GlobalObject&) const;
  141. };
  142. class Declaration : public Statement {
  143. };
  144. class FunctionNode {
  145. public:
  146. struct Parameter {
  147. FlyString name;
  148. RefPtr<Expression> default_value;
  149. bool is_rest { false };
  150. };
  151. const FlyString& name() const { return m_name; }
  152. const Statement& body() const { return *m_body; }
  153. const Vector<Parameter>& parameters() const { return m_parameters; };
  154. i32 function_length() const { return m_function_length; }
  155. protected:
  156. FunctionNode(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables)
  157. : m_name(name)
  158. , m_body(move(body))
  159. , m_parameters(move(parameters))
  160. , m_variables(move(variables))
  161. , m_function_length(function_length)
  162. {
  163. }
  164. void dump(int indent, const char* class_name) const;
  165. const NonnullRefPtrVector<VariableDeclaration>& variables() const { return m_variables; }
  166. private:
  167. FlyString m_name;
  168. NonnullRefPtr<Statement> m_body;
  169. const Vector<Parameter> m_parameters;
  170. NonnullRefPtrVector<VariableDeclaration> m_variables;
  171. const i32 m_function_length;
  172. };
  173. class FunctionDeclaration final
  174. : public Declaration
  175. , public FunctionNode {
  176. public:
  177. static bool must_have_name() { return true; }
  178. FunctionDeclaration(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables)
  179. : FunctionNode(name, move(body), move(parameters), function_length, move(variables))
  180. {
  181. }
  182. virtual Value execute(Interpreter&, GlobalObject&) const override;
  183. virtual void dump(int indent) const override;
  184. private:
  185. virtual const char* class_name() const override { return "FunctionDeclaration"; }
  186. };
  187. class FunctionExpression final
  188. : public Expression
  189. , public FunctionNode {
  190. public:
  191. static bool must_have_name() { return false; }
  192. FunctionExpression(const FlyString& name, NonnullRefPtr<Statement> body, Vector<Parameter> parameters, i32 function_length, NonnullRefPtrVector<VariableDeclaration> variables, bool is_arrow_function = false)
  193. : FunctionNode(name, move(body), move(parameters), function_length, move(variables))
  194. , m_is_arrow_function(is_arrow_function)
  195. {
  196. }
  197. virtual Value execute(Interpreter&, GlobalObject&) const override;
  198. virtual void dump(int indent) const override;
  199. private:
  200. virtual const char* class_name() const override { return "FunctionExpression"; }
  201. bool m_is_arrow_function;
  202. };
  203. class ErrorExpression final : public Expression {
  204. public:
  205. Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
  206. const char* class_name() const override { return "ErrorExpression"; }
  207. };
  208. class ReturnStatement : public Statement {
  209. public:
  210. explicit ReturnStatement(RefPtr<Expression> argument)
  211. : m_argument(move(argument))
  212. {
  213. }
  214. const Expression* argument() const { return m_argument; }
  215. virtual Value execute(Interpreter&, GlobalObject&) const override;
  216. virtual void dump(int indent) const override;
  217. private:
  218. virtual const char* class_name() const override { return "ReturnStatement"; }
  219. RefPtr<Expression> m_argument;
  220. };
  221. class IfStatement : public Statement {
  222. public:
  223. IfStatement(NonnullRefPtr<Expression> predicate, NonnullRefPtr<Statement> consequent, RefPtr<Statement> alternate)
  224. : m_predicate(move(predicate))
  225. , m_consequent(move(consequent))
  226. , m_alternate(move(alternate))
  227. {
  228. }
  229. const Expression& predicate() const { return *m_predicate; }
  230. const Statement& consequent() const { return *m_consequent; }
  231. const Statement* alternate() const { return m_alternate; }
  232. virtual Value execute(Interpreter&, GlobalObject&) const override;
  233. virtual void dump(int indent) const override;
  234. private:
  235. virtual const char* class_name() const override { return "IfStatement"; }
  236. NonnullRefPtr<Expression> m_predicate;
  237. NonnullRefPtr<Statement> m_consequent;
  238. RefPtr<Statement> m_alternate;
  239. };
  240. class WhileStatement : public Statement {
  241. public:
  242. WhileStatement(NonnullRefPtr<Expression> test, NonnullRefPtr<Statement> body)
  243. : m_test(move(test))
  244. , m_body(move(body))
  245. {
  246. }
  247. const Expression& test() const { return *m_test; }
  248. const Statement& body() const { return *m_body; }
  249. virtual Value execute(Interpreter&, GlobalObject&) const override;
  250. virtual void dump(int indent) const override;
  251. private:
  252. virtual const char* class_name() const override { return "WhileStatement"; }
  253. NonnullRefPtr<Expression> m_test;
  254. NonnullRefPtr<Statement> m_body;
  255. };
  256. class DoWhileStatement : public Statement {
  257. public:
  258. DoWhileStatement(NonnullRefPtr<Expression> test, NonnullRefPtr<Statement> body)
  259. : m_test(move(test))
  260. , m_body(move(body))
  261. {
  262. }
  263. const Expression& test() const { return *m_test; }
  264. const Statement& body() const { return *m_body; }
  265. virtual Value execute(Interpreter&, GlobalObject&) const override;
  266. virtual void dump(int indent) const override;
  267. private:
  268. virtual const char* class_name() const override { return "DoWhileStatement"; }
  269. NonnullRefPtr<Expression> m_test;
  270. NonnullRefPtr<Statement> m_body;
  271. };
  272. class ForStatement : public Statement {
  273. public:
  274. ForStatement(RefPtr<ASTNode> init, RefPtr<Expression> test, RefPtr<Expression> update, NonnullRefPtr<Statement> body)
  275. : m_init(move(init))
  276. , m_test(move(test))
  277. , m_update(move(update))
  278. , m_body(move(body))
  279. {
  280. }
  281. const ASTNode* init() const { return m_init; }
  282. const Expression* test() const { return m_test; }
  283. const Expression* update() const { return m_update; }
  284. const Statement& body() const { return *m_body; }
  285. virtual Value execute(Interpreter&, GlobalObject&) const override;
  286. virtual void dump(int indent) const override;
  287. private:
  288. virtual const char* class_name() const override { return "ForStatement"; }
  289. RefPtr<ASTNode> m_init;
  290. RefPtr<Expression> m_test;
  291. RefPtr<Expression> m_update;
  292. NonnullRefPtr<Statement> m_body;
  293. };
  294. class ForInStatement : public Statement {
  295. public:
  296. ForInStatement(NonnullRefPtr<ASTNode> lhs, NonnullRefPtr<Expression> rhs, NonnullRefPtr<Statement> body)
  297. : m_lhs(move(lhs))
  298. , m_rhs(move(rhs))
  299. , m_body(move(body))
  300. {
  301. }
  302. const ASTNode& lhs() const { return *m_lhs; }
  303. const Expression& rhs() const { return *m_rhs; }
  304. const Statement& body() const { return *m_body; }
  305. virtual Value execute(Interpreter&, GlobalObject&) const override;
  306. virtual void dump(int indent) const override;
  307. private:
  308. virtual const char* class_name() const override { return "ForInStatement"; }
  309. NonnullRefPtr<ASTNode> m_lhs;
  310. NonnullRefPtr<Expression> m_rhs;
  311. NonnullRefPtr<Statement> m_body;
  312. };
  313. class ForOfStatement : public Statement {
  314. public:
  315. ForOfStatement(NonnullRefPtr<ASTNode> lhs, NonnullRefPtr<Expression> rhs, NonnullRefPtr<Statement> body)
  316. : m_lhs(move(lhs))
  317. , m_rhs(move(rhs))
  318. , m_body(move(body))
  319. {
  320. }
  321. const ASTNode& lhs() const { return *m_lhs; }
  322. const Expression& rhs() const { return *m_rhs; }
  323. const Statement& body() const { return *m_body; }
  324. virtual Value execute(Interpreter&, GlobalObject&) const override;
  325. virtual void dump(int indent) const override;
  326. private:
  327. virtual const char* class_name() const override { return "ForOfStatement"; }
  328. NonnullRefPtr<ASTNode> m_lhs;
  329. NonnullRefPtr<Expression> m_rhs;
  330. NonnullRefPtr<Statement> m_body;
  331. };
  332. enum class BinaryOp {
  333. Addition,
  334. Subtraction,
  335. Multiplication,
  336. Division,
  337. Modulo,
  338. Exponentiation,
  339. TypedEquals,
  340. TypedInequals,
  341. AbstractEquals,
  342. AbstractInequals,
  343. GreaterThan,
  344. GreaterThanEquals,
  345. LessThan,
  346. LessThanEquals,
  347. BitwiseAnd,
  348. BitwiseOr,
  349. BitwiseXor,
  350. LeftShift,
  351. RightShift,
  352. UnsignedRightShift,
  353. In,
  354. InstanceOf,
  355. };
  356. class BinaryExpression : public Expression {
  357. public:
  358. BinaryExpression(BinaryOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  359. : m_op(op)
  360. , m_lhs(move(lhs))
  361. , m_rhs(move(rhs))
  362. {
  363. }
  364. virtual Value execute(Interpreter&, GlobalObject&) const override;
  365. virtual void dump(int indent) const override;
  366. private:
  367. virtual const char* class_name() const override { return "BinaryExpression"; }
  368. BinaryOp m_op;
  369. NonnullRefPtr<Expression> m_lhs;
  370. NonnullRefPtr<Expression> m_rhs;
  371. };
  372. enum class LogicalOp {
  373. And,
  374. Or,
  375. NullishCoalescing,
  376. };
  377. class LogicalExpression : public Expression {
  378. public:
  379. LogicalExpression(LogicalOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  380. : m_op(op)
  381. , m_lhs(move(lhs))
  382. , m_rhs(move(rhs))
  383. {
  384. }
  385. virtual Value execute(Interpreter&, GlobalObject&) const override;
  386. virtual void dump(int indent) const override;
  387. private:
  388. virtual const char* class_name() const override { return "LogicalExpression"; }
  389. LogicalOp m_op;
  390. NonnullRefPtr<Expression> m_lhs;
  391. NonnullRefPtr<Expression> m_rhs;
  392. };
  393. enum class UnaryOp {
  394. BitwiseNot,
  395. Not,
  396. Plus,
  397. Minus,
  398. Typeof,
  399. Void,
  400. Delete,
  401. };
  402. class UnaryExpression : public Expression {
  403. public:
  404. UnaryExpression(UnaryOp op, NonnullRefPtr<Expression> lhs)
  405. : m_op(op)
  406. , m_lhs(move(lhs))
  407. {
  408. }
  409. virtual Value execute(Interpreter&, GlobalObject&) const override;
  410. virtual void dump(int indent) const override;
  411. private:
  412. virtual const char* class_name() const override { return "UnaryExpression"; }
  413. UnaryOp m_op;
  414. NonnullRefPtr<Expression> m_lhs;
  415. };
  416. class SequenceExpression final : public Expression {
  417. public:
  418. SequenceExpression(NonnullRefPtrVector<Expression> expressions)
  419. : m_expressions(move(expressions))
  420. {
  421. }
  422. virtual void dump(int indent) const override;
  423. virtual Value execute(Interpreter&, GlobalObject&) const override;
  424. private:
  425. virtual const char* class_name() const override { return "SequenceExpression"; }
  426. NonnullRefPtrVector<Expression> m_expressions;
  427. };
  428. class Literal : public Expression {
  429. protected:
  430. explicit Literal() { }
  431. };
  432. class BooleanLiteral final : public Literal {
  433. public:
  434. explicit BooleanLiteral(bool value)
  435. : m_value(value)
  436. {
  437. }
  438. virtual Value execute(Interpreter&, GlobalObject&) const override;
  439. virtual void dump(int indent) const override;
  440. private:
  441. virtual const char* class_name() const override { return "BooleanLiteral"; }
  442. bool m_value { false };
  443. };
  444. class NumericLiteral final : public Literal {
  445. public:
  446. explicit NumericLiteral(double value)
  447. : m_value(value)
  448. {
  449. }
  450. virtual Value execute(Interpreter&, GlobalObject&) const override;
  451. virtual void dump(int indent) const override;
  452. private:
  453. virtual const char* class_name() const override { return "NumericLiteral"; }
  454. double m_value { 0 };
  455. };
  456. class BigIntLiteral final : public Literal {
  457. public:
  458. explicit BigIntLiteral(String value)
  459. : m_value(move(value))
  460. {
  461. }
  462. virtual Value execute(Interpreter&, GlobalObject&) const override;
  463. virtual void dump(int indent) const override;
  464. private:
  465. virtual const char* class_name() const override { return "BigIntLiteral"; }
  466. String m_value;
  467. };
  468. class StringLiteral final : public Literal {
  469. public:
  470. explicit StringLiteral(String value)
  471. : m_value(move(value))
  472. {
  473. }
  474. StringView value() const { return m_value; }
  475. virtual Value execute(Interpreter&, GlobalObject&) const override;
  476. virtual void dump(int indent) const override;
  477. private:
  478. virtual const char* class_name() const override { return "StringLiteral"; }
  479. String m_value;
  480. };
  481. class NullLiteral final : public Literal {
  482. public:
  483. explicit NullLiteral() { }
  484. virtual Value execute(Interpreter&, GlobalObject&) const override;
  485. virtual void dump(int indent) const override;
  486. private:
  487. virtual const char* class_name() const override { return "NullLiteral"; }
  488. };
  489. class RegExpLiteral final : public Literal {
  490. public:
  491. explicit RegExpLiteral(String content, String flags)
  492. : m_content(content)
  493. , m_flags(flags)
  494. {
  495. }
  496. virtual Value execute(Interpreter&, GlobalObject&) const override;
  497. virtual void dump(int indent) const override;
  498. const String& content() const { return m_content; }
  499. const String& flags() const { return m_flags; }
  500. private:
  501. virtual const char* class_name() const override { return "RegexLiteral"; }
  502. String m_content;
  503. String m_flags;
  504. };
  505. class Identifier final : public Expression {
  506. public:
  507. explicit Identifier(const FlyString& string)
  508. : m_string(string)
  509. {
  510. }
  511. const FlyString& string() const { return m_string; }
  512. virtual Value execute(Interpreter&, GlobalObject&) const override;
  513. virtual void dump(int indent) const override;
  514. virtual bool is_identifier() const override { return true; }
  515. virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
  516. private:
  517. virtual const char* class_name() const override { return "Identifier"; }
  518. FlyString m_string;
  519. };
  520. class ClassMethod final : public ASTNode {
  521. public:
  522. enum class Kind {
  523. Method,
  524. Getter,
  525. Setter,
  526. };
  527. ClassMethod(NonnullRefPtr<Expression> key, NonnullRefPtr<FunctionExpression> function, Kind kind, bool is_static)
  528. : m_key(move(key))
  529. , m_function(move(function))
  530. , m_kind(kind)
  531. , m_is_static(is_static)
  532. {
  533. }
  534. const Expression& key() const { return *m_key; }
  535. Kind kind() const { return m_kind; }
  536. bool is_static() const { return m_is_static; }
  537. virtual Value execute(Interpreter&, GlobalObject&) const override;
  538. virtual void dump(int indent) const override;
  539. private:
  540. virtual const char* class_name() const override { return "ClassMethod"; }
  541. NonnullRefPtr<Expression> m_key;
  542. NonnullRefPtr<FunctionExpression> m_function;
  543. Kind m_kind;
  544. bool m_is_static;
  545. };
  546. class SuperExpression final : public Expression {
  547. public:
  548. virtual Value execute(Interpreter&, GlobalObject&) const override;
  549. virtual void dump(int indent) const override;
  550. private:
  551. virtual bool is_super_expression() const override { return true; }
  552. virtual const char* class_name() const override { return "SuperExpression"; }
  553. };
  554. class ClassExpression final : public Expression {
  555. public:
  556. ClassExpression(String name, RefPtr<FunctionExpression> constructor, RefPtr<Expression> super_class, NonnullRefPtrVector<ClassMethod> methods)
  557. : m_name(move(name))
  558. , m_constructor(move(constructor))
  559. , m_super_class(move(super_class))
  560. , m_methods(move(methods))
  561. {
  562. }
  563. StringView name() const { return m_name; }
  564. virtual Value execute(Interpreter&, GlobalObject&) const override;
  565. virtual void dump(int indent) const override;
  566. private:
  567. virtual const char* class_name() const override { return "ClassExpression"; }
  568. String m_name;
  569. RefPtr<FunctionExpression> m_constructor;
  570. RefPtr<Expression> m_super_class;
  571. NonnullRefPtrVector<ClassMethod> m_methods;
  572. };
  573. class ClassDeclaration final : public Declaration {
  574. public:
  575. ClassDeclaration(NonnullRefPtr<ClassExpression> class_expression)
  576. : m_class_expression(move(class_expression))
  577. {
  578. }
  579. virtual Value execute(Interpreter&, GlobalObject&) const override;
  580. virtual void dump(int indent) const override;
  581. private:
  582. virtual const char* class_name() const override { return "ClassDeclaration"; }
  583. NonnullRefPtr<ClassExpression> m_class_expression;
  584. };
  585. class SpreadExpression final : public Expression {
  586. public:
  587. explicit SpreadExpression(NonnullRefPtr<Expression> target)
  588. : m_target(target)
  589. {
  590. }
  591. virtual Value execute(Interpreter&, GlobalObject&) const override;
  592. virtual void dump(int indent) const override;
  593. virtual bool is_spread_expression() const override { return true; }
  594. private:
  595. virtual const char* class_name() const override { return "SpreadExpression"; }
  596. NonnullRefPtr<Expression> m_target;
  597. };
  598. class ThisExpression final : public Expression {
  599. public:
  600. virtual Value execute(Interpreter&, GlobalObject&) const override;
  601. virtual void dump(int indent) const override;
  602. private:
  603. virtual const char* class_name() const override { return "ThisExpression"; }
  604. };
  605. class CallExpression : public Expression {
  606. public:
  607. struct Argument {
  608. NonnullRefPtr<Expression> value;
  609. bool is_spread;
  610. };
  611. CallExpression(NonnullRefPtr<Expression> callee, Vector<Argument> arguments = {})
  612. : m_callee(move(callee))
  613. , m_arguments(move(arguments))
  614. {
  615. }
  616. virtual Value execute(Interpreter&, GlobalObject&) const override;
  617. virtual void dump(int indent) const override;
  618. private:
  619. virtual const char* class_name() const override { return "CallExpression"; }
  620. virtual bool is_call_expression() const override { return true; }
  621. struct ThisAndCallee {
  622. Value this_value;
  623. Value callee;
  624. };
  625. ThisAndCallee compute_this_and_callee(Interpreter&, GlobalObject&) const;
  626. NonnullRefPtr<Expression> m_callee;
  627. const Vector<Argument> m_arguments;
  628. };
  629. class NewExpression final : public CallExpression {
  630. public:
  631. NewExpression(NonnullRefPtr<Expression> callee, Vector<Argument> arguments = {})
  632. : CallExpression(move(callee), move(arguments))
  633. {
  634. }
  635. private:
  636. virtual const char* class_name() const override { return "NewExpression"; }
  637. virtual bool is_call_expression() const override { return false; }
  638. virtual bool is_new_expression() const override { return true; }
  639. };
  640. enum class AssignmentOp {
  641. Assignment,
  642. AdditionAssignment,
  643. SubtractionAssignment,
  644. MultiplicationAssignment,
  645. DivisionAssignment,
  646. ModuloAssignment,
  647. ExponentiationAssignment,
  648. BitwiseAndAssignment,
  649. BitwiseOrAssignment,
  650. BitwiseXorAssignment,
  651. LeftShiftAssignment,
  652. RightShiftAssignment,
  653. UnsignedRightShiftAssignment,
  654. };
  655. class AssignmentExpression : public Expression {
  656. public:
  657. AssignmentExpression(AssignmentOp op, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  658. : m_op(op)
  659. , m_lhs(move(lhs))
  660. , m_rhs(move(rhs))
  661. {
  662. }
  663. virtual Value execute(Interpreter&, GlobalObject&) const override;
  664. virtual void dump(int indent) const override;
  665. private:
  666. virtual const char* class_name() const override { return "AssignmentExpression"; }
  667. AssignmentOp m_op;
  668. NonnullRefPtr<Expression> m_lhs;
  669. NonnullRefPtr<Expression> m_rhs;
  670. };
  671. enum class UpdateOp {
  672. Increment,
  673. Decrement,
  674. };
  675. class UpdateExpression : public Expression {
  676. public:
  677. UpdateExpression(UpdateOp op, NonnullRefPtr<Expression> argument, bool prefixed = false)
  678. : m_op(op)
  679. , m_argument(move(argument))
  680. , m_prefixed(prefixed)
  681. {
  682. }
  683. virtual Value execute(Interpreter&, GlobalObject&) const override;
  684. virtual void dump(int indent) const override;
  685. private:
  686. virtual const char* class_name() const override { return "UpdateExpression"; }
  687. UpdateOp m_op;
  688. NonnullRefPtr<Expression> m_argument;
  689. bool m_prefixed;
  690. };
  691. enum class DeclarationKind {
  692. Var,
  693. Let,
  694. Const,
  695. };
  696. class VariableDeclarator final : public ASTNode {
  697. public:
  698. VariableDeclarator(NonnullRefPtr<Identifier> id)
  699. : m_id(move(id))
  700. {
  701. }
  702. VariableDeclarator(NonnullRefPtr<Identifier> id, RefPtr<Expression> init)
  703. : m_id(move(id))
  704. , m_init(move(init))
  705. {
  706. }
  707. const Identifier& id() const { return m_id; }
  708. const Expression* init() const { return m_init; }
  709. virtual Value execute(Interpreter&, GlobalObject&) const override;
  710. virtual void dump(int indent) const override;
  711. private:
  712. virtual const char* class_name() const override { return "VariableDeclarator"; }
  713. NonnullRefPtr<Identifier> m_id;
  714. RefPtr<Expression> m_init;
  715. };
  716. class VariableDeclaration : public Declaration {
  717. public:
  718. VariableDeclaration(DeclarationKind declaration_kind, NonnullRefPtrVector<VariableDeclarator> declarations)
  719. : m_declaration_kind(declaration_kind)
  720. , m_declarations(move(declarations))
  721. {
  722. }
  723. virtual bool is_variable_declaration() const override { return true; }
  724. DeclarationKind declaration_kind() const { return m_declaration_kind; }
  725. virtual Value execute(Interpreter&, GlobalObject&) const override;
  726. virtual void dump(int indent) const override;
  727. const NonnullRefPtrVector<VariableDeclarator>& declarations() const { return m_declarations; }
  728. private:
  729. virtual const char* class_name() const override { return "VariableDeclaration"; }
  730. DeclarationKind m_declaration_kind;
  731. NonnullRefPtrVector<VariableDeclarator> m_declarations;
  732. };
  733. class ObjectProperty final : public ASTNode {
  734. public:
  735. enum class Type {
  736. KeyValue,
  737. Getter,
  738. Setter,
  739. Spread,
  740. };
  741. ObjectProperty(NonnullRefPtr<Expression> key, RefPtr<Expression> value, Type property_type, bool is_method)
  742. : m_key(move(key))
  743. , m_value(move(value))
  744. , m_property_type(property_type)
  745. , m_is_method(is_method)
  746. {
  747. }
  748. const Expression& key() const { return m_key; }
  749. const Expression& value() const
  750. {
  751. ASSERT(m_value);
  752. return *m_value;
  753. }
  754. Type type() const { return m_property_type; }
  755. bool is_method() const { return m_is_method; }
  756. virtual void dump(int indent) const override;
  757. virtual Value execute(Interpreter&, GlobalObject&) const override;
  758. private:
  759. virtual const char* class_name() const override { return "ObjectProperty"; }
  760. NonnullRefPtr<Expression> m_key;
  761. RefPtr<Expression> m_value;
  762. Type m_property_type;
  763. bool m_is_method { false };
  764. };
  765. class ObjectExpression : public Expression {
  766. public:
  767. ObjectExpression(NonnullRefPtrVector<ObjectProperty> properties = {})
  768. : m_properties(move(properties))
  769. {
  770. }
  771. virtual Value execute(Interpreter&, GlobalObject&) const override;
  772. virtual void dump(int indent) const override;
  773. private:
  774. virtual const char* class_name() const override { return "ObjectExpression"; }
  775. NonnullRefPtrVector<ObjectProperty> m_properties;
  776. };
  777. class ArrayExpression : public Expression {
  778. public:
  779. ArrayExpression(Vector<RefPtr<Expression>> elements)
  780. : m_elements(move(elements))
  781. {
  782. }
  783. const Vector<RefPtr<Expression>>& elements() const { return m_elements; }
  784. virtual Value execute(Interpreter&, GlobalObject&) const override;
  785. virtual void dump(int indent) const override;
  786. private:
  787. virtual const char* class_name() const override { return "ArrayExpression"; }
  788. Vector<RefPtr<Expression>> m_elements;
  789. };
  790. class TemplateLiteral final : public Expression {
  791. public:
  792. TemplateLiteral(NonnullRefPtrVector<Expression> expressions)
  793. : m_expressions(move(expressions))
  794. {
  795. }
  796. TemplateLiteral(NonnullRefPtrVector<Expression> expressions, NonnullRefPtrVector<Expression> raw_strings)
  797. : m_expressions(move(expressions))
  798. , m_raw_strings(move(raw_strings))
  799. {
  800. }
  801. virtual Value execute(Interpreter&, GlobalObject&) const override;
  802. virtual void dump(int indent) const override;
  803. const NonnullRefPtrVector<Expression>& expressions() const { return m_expressions; }
  804. const NonnullRefPtrVector<Expression>& raw_strings() const { return m_raw_strings; }
  805. private:
  806. virtual const char* class_name() const override { return "TemplateLiteral"; }
  807. const NonnullRefPtrVector<Expression> m_expressions;
  808. const NonnullRefPtrVector<Expression> m_raw_strings;
  809. };
  810. class TaggedTemplateLiteral final : public Expression {
  811. public:
  812. TaggedTemplateLiteral(NonnullRefPtr<Expression> tag, NonnullRefPtr<TemplateLiteral> template_literal)
  813. : m_tag(move(tag))
  814. , m_template_literal(move(template_literal))
  815. {
  816. }
  817. virtual Value execute(Interpreter&, GlobalObject&) const override;
  818. virtual void dump(int indent) const override;
  819. private:
  820. virtual const char* class_name() const override { return "TaggedTemplateLiteral"; }
  821. const NonnullRefPtr<Expression> m_tag;
  822. const NonnullRefPtr<TemplateLiteral> m_template_literal;
  823. };
  824. class MemberExpression final : public Expression {
  825. public:
  826. MemberExpression(NonnullRefPtr<Expression> object, NonnullRefPtr<Expression> property, bool computed = false)
  827. : m_object(move(object))
  828. , m_property(move(property))
  829. , m_computed(computed)
  830. {
  831. }
  832. virtual Value execute(Interpreter&, GlobalObject&) const override;
  833. virtual void dump(int indent) const override;
  834. virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
  835. bool is_computed() const { return m_computed; }
  836. const Expression& object() const { return *m_object; }
  837. const Expression& property() const { return *m_property; }
  838. PropertyName computed_property_name(Interpreter&, GlobalObject&) const;
  839. String to_string_approximation() const;
  840. private:
  841. virtual bool is_member_expression() const override { return true; }
  842. virtual const char* class_name() const override { return "MemberExpression"; }
  843. NonnullRefPtr<Expression> m_object;
  844. NonnullRefPtr<Expression> m_property;
  845. bool m_computed { false };
  846. };
  847. class ConditionalExpression final : public Expression {
  848. public:
  849. ConditionalExpression(NonnullRefPtr<Expression> test, NonnullRefPtr<Expression> consequent, NonnullRefPtr<Expression> alternate)
  850. : m_test(move(test))
  851. , m_consequent(move(consequent))
  852. , m_alternate(move(alternate))
  853. {
  854. }
  855. virtual void dump(int indent) const override;
  856. virtual Value execute(Interpreter&, GlobalObject&) const override;
  857. private:
  858. virtual const char* class_name() const override { return "ConditionalExpression"; }
  859. NonnullRefPtr<Expression> m_test;
  860. NonnullRefPtr<Expression> m_consequent;
  861. NonnullRefPtr<Expression> m_alternate;
  862. };
  863. class CatchClause final : public ASTNode {
  864. public:
  865. CatchClause(const FlyString& parameter, NonnullRefPtr<BlockStatement> body)
  866. : m_parameter(parameter)
  867. , m_body(move(body))
  868. {
  869. }
  870. const FlyString& parameter() const { return m_parameter; }
  871. const BlockStatement& body() const { return m_body; }
  872. virtual void dump(int indent) const override;
  873. virtual Value execute(Interpreter&, GlobalObject&) const override;
  874. private:
  875. virtual const char* class_name() const override { return "CatchClause"; }
  876. FlyString m_parameter;
  877. NonnullRefPtr<BlockStatement> m_body;
  878. };
  879. class TryStatement final : public Statement {
  880. public:
  881. TryStatement(NonnullRefPtr<BlockStatement> block, RefPtr<CatchClause> handler, RefPtr<BlockStatement> finalizer)
  882. : m_block(move(block))
  883. , m_handler(move(handler))
  884. , m_finalizer(move(finalizer))
  885. {
  886. }
  887. const BlockStatement& block() const { return m_block; }
  888. const CatchClause* handler() const { return m_handler; }
  889. const BlockStatement* finalizer() const { return m_finalizer; }
  890. virtual void dump(int indent) const override;
  891. virtual Value execute(Interpreter&, GlobalObject&) const override;
  892. private:
  893. virtual const char* class_name() const override { return "TryStatement"; }
  894. NonnullRefPtr<BlockStatement> m_block;
  895. RefPtr<CatchClause> m_handler;
  896. RefPtr<BlockStatement> m_finalizer;
  897. };
  898. class ThrowStatement final : public Statement {
  899. public:
  900. explicit ThrowStatement(NonnullRefPtr<Expression> argument)
  901. : m_argument(move(argument))
  902. {
  903. }
  904. const Expression& argument() const { return m_argument; }
  905. virtual void dump(int indent) const override;
  906. virtual Value execute(Interpreter&, GlobalObject&) const override;
  907. private:
  908. virtual const char* class_name() const override { return "ThrowStatement"; }
  909. NonnullRefPtr<Expression> m_argument;
  910. };
  911. class SwitchCase final : public ASTNode {
  912. public:
  913. SwitchCase(RefPtr<Expression> test, NonnullRefPtrVector<Statement> consequent)
  914. : m_test(move(test))
  915. , m_consequent(move(consequent))
  916. {
  917. }
  918. const Expression* test() const { return m_test; }
  919. const NonnullRefPtrVector<Statement>& consequent() const { return m_consequent; }
  920. virtual void dump(int indent) const override;
  921. virtual Value execute(Interpreter&, GlobalObject&) const override;
  922. private:
  923. virtual const char* class_name() const override { return "SwitchCase"; }
  924. RefPtr<Expression> m_test;
  925. NonnullRefPtrVector<Statement> m_consequent;
  926. };
  927. class SwitchStatement final : public Statement {
  928. public:
  929. SwitchStatement(NonnullRefPtr<Expression> discriminant, NonnullRefPtrVector<SwitchCase> cases)
  930. : m_discriminant(move(discriminant))
  931. , m_cases(move(cases))
  932. {
  933. }
  934. virtual void dump(int indent) const override;
  935. virtual Value execute(Interpreter&, GlobalObject&) const override;
  936. private:
  937. virtual const char* class_name() const override { return "SwitchStatement"; }
  938. NonnullRefPtr<Expression> m_discriminant;
  939. NonnullRefPtrVector<SwitchCase> m_cases;
  940. };
  941. class BreakStatement final : public Statement {
  942. public:
  943. BreakStatement(FlyString target_label)
  944. : m_target_label(target_label)
  945. {
  946. }
  947. virtual Value execute(Interpreter&, GlobalObject&) const override;
  948. const FlyString& target_label() const { return m_target_label; }
  949. private:
  950. virtual const char* class_name() const override { return "BreakStatement"; }
  951. FlyString m_target_label;
  952. };
  953. class ContinueStatement final : public Statement {
  954. public:
  955. ContinueStatement(FlyString target_label)
  956. : m_target_label(target_label)
  957. {
  958. }
  959. virtual Value execute(Interpreter&, GlobalObject&) const override;
  960. const FlyString& target_label() const { return m_target_label; }
  961. private:
  962. virtual const char* class_name() const override { return "ContinueStatement"; }
  963. FlyString m_target_label;
  964. };
  965. class DebuggerStatement final : public Statement {
  966. public:
  967. DebuggerStatement() { }
  968. virtual Value execute(Interpreter&, GlobalObject&) const override;
  969. private:
  970. virtual const char* class_name() const override { return "DebuggerStatement"; }
  971. };
  972. }