1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:38:11 +00:00

LibJS: Improve function hoisting across blocks

The parser now keeps track of a scope chain so that it can hoist
function declarations to the closest function scope.
This commit is contained in:
Hendi 2021-07-04 03:15:52 +02:00 committed by Linus Groh
parent 72f8d90dc5
commit 38fd980b0c
6 changed files with 79 additions and 22 deletions

View file

@ -196,13 +196,29 @@ private:
[[nodiscard]] RulePosition push_start() { return { *this, position() }; }
struct Scope : public RefCounted<Scope> {
enum Type {
Function,
Block,
};
Type type;
RefPtr<Scope> parent;
NonnullRefPtrVector<FunctionDeclaration> function_declarations;
NonnullRefPtrVector<FunctionDeclaration> hoisted_function_declarations;
explicit Scope(Type, RefPtr<Scope>);
RefPtr<Scope> get_current_function_scope();
};
struct ParserState {
Lexer lexer;
Token current_token;
Vector<Error> errors;
Vector<NonnullRefPtrVector<VariableDeclaration>> var_scopes;
Vector<NonnullRefPtrVector<VariableDeclaration>> let_scopes;
Vector<NonnullRefPtrVector<FunctionDeclaration>> function_scopes;
RefPtr<Scope> current_scope;
Vector<Vector<FunctionNode::Parameter>&> function_parameters;