support class static initialization block (#5488)
This commit is contained in:
@@ -241,6 +241,208 @@ class_super: {
|
||||
node_version: ">=4"
|
||||
}
|
||||
|
||||
static_init: {
|
||||
input: {
|
||||
var a = "foo";
|
||||
var b = null;
|
||||
class A {
|
||||
static {
|
||||
var a = "bar";
|
||||
b = true;
|
||||
var c = 42;
|
||||
console.log(a, b, c);
|
||||
}
|
||||
}
|
||||
console.log(a, b, typeof c);
|
||||
}
|
||||
expect_exact: 'var a="foo";var b=null;class A{static{var a="bar";b=true;var c=42;console.log(a,b,c)}}console.log(a,b,typeof c);'
|
||||
expect_stdout: [
|
||||
"bar true 42",
|
||||
"foo true undefined",
|
||||
]
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_field_init: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
(class {
|
||||
static [console.log("foo")] = console.log("bar");
|
||||
static {
|
||||
console.log("baz");
|
||||
}
|
||||
static [console.log("moo")] = console.log("moz");
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
(class {
|
||||
static [(console.log("foo"), console.log("moo"))] = (
|
||||
console.log("bar"),
|
||||
(() => {
|
||||
console.log("baz");
|
||||
})(),
|
||||
console.log("moz")
|
||||
);
|
||||
});
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"moo",
|
||||
"bar",
|
||||
"baz",
|
||||
"moz",
|
||||
]
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_field_init_strict: {
|
||||
options = {
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
(class {
|
||||
static [console.log("foo")] = console.log("bar");
|
||||
static {
|
||||
console.log("baz");
|
||||
}
|
||||
static [console.log("moo")] = console.log("moz");
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
console.log("foo"),
|
||||
console.log("moo"),
|
||||
(() => (
|
||||
console.log("bar"),
|
||||
(() => {
|
||||
console.log("baz");
|
||||
})(),
|
||||
console.log("moz")
|
||||
))();
|
||||
}
|
||||
expect_stdout: [
|
||||
"foo",
|
||||
"moo",
|
||||
"bar",
|
||||
"baz",
|
||||
"moz",
|
||||
]
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_init_side_effects_1: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_init_side_effects_1_strict: {
|
||||
options = {
|
||||
merge_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "FAIL";
|
||||
(() => (() => {
|
||||
a = "PASS";
|
||||
})())();
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_init_side_effects_2: {
|
||||
options = {
|
||||
hoist_props: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
static_init_side_effects_2_strict: {
|
||||
options = {
|
||||
hoist_props: true,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
}
|
||||
input: {
|
||||
"use strict";
|
||||
var a = "FAIL";
|
||||
(class {
|
||||
static {
|
||||
a = "PASS";
|
||||
}
|
||||
});
|
||||
console.log(a);
|
||||
}
|
||||
expect: {
|
||||
"use strict";
|
||||
var a = "FAIL";
|
||||
(() => (() => {
|
||||
a = "PASS";
|
||||
})())();
|
||||
console.log(a);
|
||||
}
|
||||
expect_stdout: "PASS"
|
||||
node_version: ">=16"
|
||||
}
|
||||
|
||||
block_scoped: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
|
||||
@@ -140,6 +140,7 @@ var SUPPORT = function(matrix) {
|
||||
class: "class C { f() {} }",
|
||||
class_field: "class C { p = 0; }",
|
||||
class_private: "class C { #f() {} }",
|
||||
class_static_init: "class C { static {} }",
|
||||
computed_key: "({[0]: 0});",
|
||||
const_block: "var a; { const a = 0; }",
|
||||
default_value: "[ a = 0 ] = [];",
|
||||
@@ -1181,7 +1182,11 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn
|
||||
unique_vars.length = unique_len;
|
||||
});
|
||||
}
|
||||
if (n !== 0) s += " finally { " + createStatements(3, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth) + " }";
|
||||
if (n !== 0) s += [
|
||||
" finally { ",
|
||||
createStatements(rng(5) + 1, recurmax, canThrow, canBreak, canContinue, cannotReturn, stmtDepth),
|
||||
" }",
|
||||
].join("");
|
||||
return s;
|
||||
case STMT_C:
|
||||
return "c = c + 1;";
|
||||
@@ -1839,6 +1844,16 @@ function createClassLiteral(recurmax, stmtDepth, canThrow, name) {
|
||||
async = save_async;
|
||||
}
|
||||
s += ";\n";
|
||||
} else if (SUPPORT.class_static_init && fixed && !internal && rng(10) == 0) {
|
||||
async = false;
|
||||
generator = false;
|
||||
s += [
|
||||
"{ ",
|
||||
createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CANNOT_RETURN, stmtDepth),
|
||||
" }\n",
|
||||
].join("");
|
||||
generator = save_generator;
|
||||
async = save_async;
|
||||
} else {
|
||||
if (!fixed && !internal && constructor && rng(10) == 0) {
|
||||
internal = constructor;
|
||||
|
||||
Reference in New Issue
Block a user