ladybird/Tests/LibJS/Runtime/classes/class-static-initializers.js
Andreas Kling 99596d68ab LibJS: Fix await boundaries in class elements
Treat ordinary and generator function expressions inside class static
blocks as boundaries for await binding names, while still rejecting
await as an arrow parameter in the static block itself.

Parse field initializers without inheriting an enclosing async
function's await-expression context, so script field initializers can
resolve await as an identifier while computed field names still use the
enclosing expression context.

Cover static block function expressions, class field initializers, and
the AST shape for an await arrow inside a nested function.
2026-05-22 01:56:57 +02:00

114 lines
2.5 KiB
JavaScript

test("basic functionality", () => {
var called = false;
class A {
static {
expect(called).toBeFalse();
expect(this.name).toBe("A");
called = true;
}
}
expect(called).toBeTrue();
new A();
expect(called).toBeTrue();
});
test("called in order", () => {
var i = 0;
class A {
static {
expect(i).toBe(0);
i++;
}
static method() {
return 2;
}
static {
expect(i).toBe(1);
i++;
}
}
expect(i).toBe(2);
new A();
expect(i).toBe(2);
});
test("correct this", () => {
var thisValue = null;
class A {
static {
thisValue = this;
}
}
expect(thisValue).toBe(A);
});
describe("class like constructs can be used inside", () => {
test("can use new.target", () => {
let value = 1;
class C {
static {
value = new.target;
}
}
expect(value).toBeUndefined();
});
test("can use super property lookup", () => {
function parent() {}
parent.val = 3;
let hit = false;
class C extends parent {
static {
hit = true;
expect(super.val).toBe(3);
}
}
expect(hit).toBeTrue();
});
});
// https://github.com/LadybirdBrowser/ladybird/pull/4226
test("declaring variables", () => {
class A {
static {
const a = 1;
let b = 2;
var c = 3;
function d() {}
expect(a).toBe(1);
expect(b).toBe(2);
expect(c).toBe(3);
expect(typeof d).toBe("function");
}
}
});
test("await binding names in nested functions", () => {
class A {
static {
const makeGenerator = function* await(await) {
yield await;
};
const generator = makeGenerator(42);
expect(generator.next()).toEqual({ value: 42, done: false });
expect(generator.next()).toEqual({ value: undefined, done: true });
(function await(await) {
expect(await).toBe(42);
})(42);
}
}
});
test("await binding names in static blocks without a function boundary", () => {
expect(`class A { static { await => 0; } }`).not.toEval();
expect(`class A { static { async function await() {} } }`).not.toEval();
});