Improve class parser (#289)

- accept `class P { async = 1 }}`
- accept `class P { static = 1 }}` etc.
- Fixes #261
This commit is contained in:
Charlie Gordon 2024-05-05 19:54:47 +02:00 committed by GitHub
parent d9c699f528
commit 0c8fecab23
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 13 additions and 5 deletions

View file

@ -22381,7 +22381,7 @@ static int __exception js_parse_property_name(JSParseState *s,
goto fail1; goto fail1;
if (s->token.val == ':' || s->token.val == ',' || if (s->token.val == ':' || s->token.val == ',' ||
s->token.val == '}' || s->token.val == '(' || s->token.val == '}' || s->token.val == '(' ||
s->token.val == '=' ) { s->token.val == '=') {
is_non_reserved_ident = TRUE; is_non_reserved_ident = TRUE;
goto ident_found; goto ident_found;
} }
@ -22397,7 +22397,8 @@ static int __exception js_parse_property_name(JSParseState *s,
if (next_token(s)) if (next_token(s))
goto fail1; goto fail1;
if (s->token.val == ':' || s->token.val == ',' || if (s->token.val == ':' || s->token.val == ',' ||
s->token.val == '}' || s->token.val == '(') { s->token.val == '}' || s->token.val == '(' ||
s->token.val == '=') {
is_non_reserved_ident = TRUE; is_non_reserved_ident = TRUE;
goto ident_found; goto ident_found;
} }
@ -23081,7 +23082,12 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
goto fail; goto fail;
continue; continue;
} }
is_static = (s->token.val == TOK_STATIC); is_static = FALSE;
if (s->token.val == TOK_STATIC) {
int next = peek_token(s, TRUE);
if (!(next == ';' || next == '}' || next == '(' || next == '='))
is_static = TRUE;
}
prop_type = -1; prop_type = -1;
if (is_static) { if (is_static) {
if (next_token(s)) if (next_token(s))

View file

@ -335,11 +335,13 @@ function test_class()
assert(S.x === 42); assert(S.x === 42);
assert(S.y === 42); assert(S.y === 42);
assert(S.z === 42); assert(S.z === 42);
class P { class P {
get = () => "123" get = () => "123";
static() { return 42; }
} }
assert(new P().get() === "123"); assert(new P().get() === "123");
assert(new P().static() === 42);
}; };
function test_template() function test_template()