1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 21:07:36 +00:00

LibJS: Support VariableDeclaration with multiple declarators

This patch adds support in the parser and interpreter for this:

    var a = 1, b = 2, c = a + b;

VariableDeclaration is now a sequence of VariableDeclarators. :^)
This commit is contained in:
Andreas Kling 2020-04-04 21:46:25 +02:00
parent 9691286cf0
commit 5e40aa182b
4 changed files with 76 additions and 22 deletions

View file

@ -579,17 +579,36 @@ enum class DeclarationType {
Const,
};
class VariableDeclarator final : public ASTNode {
public:
VariableDeclarator(NonnullRefPtr<Identifier> id, RefPtr<Expression> init)
: m_id(move(id))
, m_init(move(init))
{
}
const Identifier& id() const { return m_id; }
const Expression* init() const { return m_init; }
virtual Value execute(Interpreter&) const override;
virtual void dump(int indent) const override;
private:
virtual const char* class_name() const override { return "VariableDeclarator"; }
NonnullRefPtr<Identifier> m_id;
RefPtr<Expression> m_init;
};
class VariableDeclaration : public Declaration {
public:
VariableDeclaration(NonnullRefPtr<Identifier> name, RefPtr<Expression> initializer, DeclarationType declaration_type)
VariableDeclaration(DeclarationType declaration_type, NonnullRefPtrVector<VariableDeclarator> declarations)
: m_declaration_type(declaration_type)
, m_name(move(name))
, m_initializer(move(initializer))
, m_declarations(move(declarations))
{
}
virtual bool is_variable_declaration() const override { return true; }
const Identifier& name() const { return *m_name; }
DeclarationType declaration_type() const { return m_declaration_type; }
virtual Value execute(Interpreter&) const override;
@ -599,8 +618,7 @@ private:
virtual const char* class_name() const override { return "VariableDeclaration"; }
DeclarationType m_declaration_type;
NonnullRefPtr<Identifier> m_name;
RefPtr<Expression> m_initializer;
NonnullRefPtrVector<VariableDeclarator> m_declarations;
};
class ObjectExpression : public Expression {