From 1a05b81387eedbb2fb86a404e8df69dc96ac21e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 12 Mar 2021 17:29:55 -0500 Subject: [PATCH] Support multiple static blocks (#12738) --- .../babel-parser/src/parser/error-message.js | 1 - packages/babel-parser/src/parser/statement.js | 12 +------ packages/babel-parser/src/types.js | 1 - .../input.js | 0 .../output.json | 3 -- .../src/index.js | 36 +++++++++---------- .../class-static-block/class-binding/exec.js | 2 +- .../class-static-block/class-binding/input.js | 7 ++++ .../class-binding/output.js | 8 +++++ .../class-declaration/exec.js | 2 +- .../class-declaration/input.js | 2 +- .../multiple-static-initializers/exec.js | 10 ++++-- .../multiple-static-initializers/input.js | 11 ++++++ .../multiple-static-initializers/output.js | 11 ++++++ .../class-static-block/new-target/exec.js | 10 ++++++ .../class-static-block/new-target/input.js | 10 ++++++ .../class-static-block/new-target/output.js | 12 +++++++ .../integration-loose/.new-target/exec.js | 10 ++++++ .../integration-loose/.new-target/input.js | 10 ++++++ .../integration-loose/class-binding/exec.js | 2 +- .../integration-loose/class-binding/input.js | 2 +- .../class-declaration/exec.js | 2 +- .../class-declaration/input.js | 2 +- .../multiple-static-initializers/exec.js | 10 ++++-- .../multiple-static-initializers/input.js | 11 ++++++ .../multiple-static-initializers/output.js | 26 ++++++++++++++ .../fixtures/integration/.new-target/exec.js | 10 ++++++ .../fixtures/integration/.new-target/input.js | 11 ++++++ .../integration/class-binding/exec.js | 2 +- .../integration/class-binding/input.js | 2 +- .../integration/class-declaration/exec.js | 2 +- .../integration/class-declaration/input.js | 2 +- .../multiple-static-initializers/exec.js | 10 ++++-- .../multiple-static-initializers/input.js | 11 ++++++ .../multiple-static-initializers/output.js | 20 +++++++++++ 35 files changed, 231 insertions(+), 52 deletions(-) rename packages/babel-parser/test/fixtures/experimental/class-static-block/{invalid-duplicated-static-block => multiple-static-block}/input.js (100%) rename packages/babel-parser/test/fixtures/experimental/class-static-block/{invalid-duplicated-static-block => multiple-static-block}/output.json (96%) create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/output.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/output.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/exec.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/output.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/exec.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/output.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/exec.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/input.js create mode 100644 packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/output.js diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index 6a28595c737b..c7b6fb413271 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -49,7 +49,6 @@ export const ErrorMessages = Object.freeze({ "`%0` has already been exported. Exported identifiers must be unique.", DuplicateProto: "Redefinition of __proto__ property", DuplicateRegExpFlags: "Duplicate regular expression flag", - DuplicateStaticBlock: "Duplicate static block in the same class", ElementAfterRest: "Rest element must be last element", EscapedCharNotAnIdentifier: "Invalid Unicode escape", ExportBindingIsString: diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index de23bfb0cd53..521b28574bbe 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1204,7 +1204,6 @@ export default class StatementParser extends ExpressionParser { const state: N.ParseClassMemberState = { constructorAllowsSuper, hadConstructor: false, - hadStaticBlock: false, }; let decorators: N.Decorator[] = []; const classBody: N.ClassBody = this.startNode(); @@ -1313,11 +1312,7 @@ export default class StatementParser extends ExpressionParser { return; } if (this.eat(tt.braceL)) { - this.parseClassStaticBlock( - classBody, - ((member: any): N.StaticBlock), - state, - ); + this.parseClassStaticBlock(classBody, ((member: any): N.StaticBlock)); return; } } @@ -1521,7 +1516,6 @@ export default class StatementParser extends ExpressionParser { parseClassStaticBlock( classBody: N.ClassBody, member: N.StaticBlock & { decorators?: Array }, - state: N.ParseClassMemberState, ) { this.expectPlugin("classStaticBlock", member.start); // Start a new lexical scope @@ -1538,13 +1532,9 @@ export default class StatementParser extends ExpressionParser { this.scope.exit(); this.state.labels = oldLabels; classBody.body.push(this.finishNode(member, "StaticBlock")); - if (state.hadStaticBlock) { - this.raise(member.start, Errors.DuplicateStaticBlock); - } if (member.decorators?.length) { this.raise(member.start, Errors.DecoratorStaticBlock); } - state.hadStaticBlock = true; } pushClassProperty(classBody: N.ClassBody, prop: N.ClassProperty) { diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index 43addde542ff..26ef5320c07a 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1528,6 +1528,5 @@ export type ParseSubscriptState = { export type ParseClassMemberState = {| hadConstructor: boolean, - hadStaticBlock: boolean, constructorAllowsSuper: boolean, |}; diff --git a/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-duplicated-static-block/input.js b/packages/babel-parser/test/fixtures/experimental/class-static-block/multiple-static-block/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-duplicated-static-block/input.js rename to packages/babel-parser/test/fixtures/experimental/class-static-block/multiple-static-block/input.js diff --git a/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-duplicated-static-block/output.json b/packages/babel-parser/test/fixtures/experimental/class-static-block/multiple-static-block/output.json similarity index 96% rename from packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-duplicated-static-block/output.json rename to packages/babel-parser/test/fixtures/experimental/class-static-block/multiple-static-block/output.json index ee9eecdf60fa..a23626c95f4f 100644 --- a/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-duplicated-static-block/output.json +++ b/packages/babel-parser/test/fixtures/experimental/class-static-block/multiple-static-block/output.json @@ -1,9 +1,6 @@ { "type": "File", "start":0,"end":53,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, - "errors": [ - "SyntaxError: Duplicate static block in the same class (4:2)" - ], "program": { "type": "Program", "start":0,"end":53,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}}, diff --git a/packages/babel-plugin-proposal-class-static-block/src/index.js b/packages/babel-plugin-proposal-class-static-block/src/index.js index 18f6159cfe2d..e9eed3441d92 100644 --- a/packages/babel-plugin-proposal-class-static-block/src/index.js +++ b/packages/babel-plugin-proposal-class-static-block/src/index.js @@ -30,30 +30,28 @@ export default declare(({ types: t, template, assertVersion }) => { const { scope } = path; const classBody = path.get("body"); const privateNames = new Set(); - let staticBlockPath; - for (const path of classBody.get("body")) { + const body = classBody.get("body"); + for (const path of body) { if (path.isPrivate()) { privateNames.add(path.get("key.id").node.name); - } else if (path.isStaticBlock()) { - staticBlockPath = path; } } - if (!staticBlockPath) { - return; + for (const path of body) { + if (!path.isStaticBlock()) continue; + const staticBlockPrivateId = generateUid(scope, privateNames); + privateNames.add(staticBlockPrivateId); + const staticBlockRef = t.privateName( + t.identifier(staticBlockPrivateId), + ); + path.replaceWith( + t.classPrivateProperty( + staticBlockRef, + template.expression.ast`(() => { ${path.node.body} })()`, + [], + /* static */ true, + ), + ); } - const staticBlockRef = t.privateName( - t.identifier(generateUid(scope, privateNames)), - ); - classBody.pushContainer( - "body", - t.classPrivateProperty( - staticBlockRef, - template.expression.ast`(() => { ${staticBlockPath.node.body} })()`, - [], - /* static */ true, - ), - ); - staticBlockPath.remove(); }, }, }; diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js index aea35fe5c6ec..c8d028e6cb89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = Foo.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/input.js new file mode 100644 index 000000000000..c8d028e6cb89 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/input.js @@ -0,0 +1,7 @@ +class Foo { + static bar = 42; + static { + this.foo = Foo.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/output.js new file mode 100644 index 000000000000..10b9e369d6c0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/output.js @@ -0,0 +1,8 @@ +class Foo { + static bar = 42; + static #_ = (() => { + this.foo = Foo.bar; + })(); +} + +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js index 657be074147c..92cd4eef0534 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js @@ -1,8 +1,14 @@ class Foo { static #bar = 21; static { - this.foo = this.#bar + this.qux; + this.foo = this.#bar; + this.qux1 = this.qux; } static qux = 21; + static { + this.qux2 = this.qux; + } } -expect(Foo.foo).toBe(42); +expect(Foo.foo).toBe(21); +expect(Foo.qux1).toBe(undefined); +expect(Foo.qux2).toBe(21); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/input.js new file mode 100644 index 000000000000..7b4c65f1e22a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/input.js @@ -0,0 +1,11 @@ +class Foo { + static #bar = 21; + static { + this.foo = this.#bar; + this.qux1 = this.qux; + } + static qux = 21; + static { + this.qux2 = this.qux; + } +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/output.js new file mode 100644 index 000000000000..c68a67db8fc3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/output.js @@ -0,0 +1,11 @@ +class Foo { + static #bar = 21; + static #_ = (() => { + this.foo = this.#bar; + this.qux1 = this.qux; + })(); + static qux = 21; + static #_2 = (() => { + this.qux2 = this.qux; + })(); +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/exec.js new file mode 100644 index 000000000000..f7328ab49571 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/exec.js @@ -0,0 +1,10 @@ +class Base { + constructor() { + this.Foo = class { + static { + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/input.js new file mode 100644 index 000000000000..f7328ab49571 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/input.js @@ -0,0 +1,10 @@ +class Base { + constructor() { + this.Foo = class { + static { + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/output.js new file mode 100644 index 000000000000..532e0d7d72fe --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/new-target/output.js @@ -0,0 +1,12 @@ +class Base { + constructor() { + this.Foo = class { + static #_ = (() => { + this.foo = new.target; + })(); + }; + } + +} + +expect(new Base().Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/exec.js new file mode 100644 index 000000000000..f7328ab49571 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/exec.js @@ -0,0 +1,10 @@ +class Base { + constructor() { + this.Foo = class { + static { + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/input.js new file mode 100644 index 000000000000..f7328ab49571 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/.new-target/input.js @@ -0,0 +1,10 @@ +class Base { + constructor() { + this.Foo = class { + static { + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js index aea35fe5c6ec..c8d028e6cb89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = Foo.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.js index aea35fe5c6ec..c8d028e6cb89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = Foo.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js index 657be074147c..92cd4eef0534 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js @@ -1,8 +1,14 @@ class Foo { static #bar = 21; static { - this.foo = this.#bar + this.qux; + this.foo = this.#bar; + this.qux1 = this.qux; } static qux = 21; + static { + this.qux2 = this.qux; + } } -expect(Foo.foo).toBe(42); +expect(Foo.foo).toBe(21); +expect(Foo.qux1).toBe(undefined); +expect(Foo.qux2).toBe(21); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/input.js new file mode 100644 index 000000000000..7b4c65f1e22a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/input.js @@ -0,0 +1,11 @@ +class Foo { + static #bar = 21; + static { + this.foo = this.#bar; + this.qux1 = this.qux; + } + static qux = 21; + static { + this.qux2 = this.qux; + } +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/output.js new file mode 100644 index 000000000000..3d22e8238371 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/output.js @@ -0,0 +1,26 @@ +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); + +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +var _2 = babelHelpers.classPrivateFieldLooseKey("_2"); + +class Foo {} + +Object.defineProperty(Foo, _bar, { + writable: true, + value: 21 +}); +Object.defineProperty(Foo, _, { + writable: true, + value: (() => { + Foo.foo = babelHelpers.classPrivateFieldLooseBase(Foo, _bar)[_bar]; + Foo.qux1 = Foo.qux; + })() +}); +Foo.qux = 21; +Object.defineProperty(Foo, _2, { + writable: true, + value: (() => { + Foo.qux2 = Foo.qux; + })() +}); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/exec.js new file mode 100644 index 000000000000..f7328ab49571 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/exec.js @@ -0,0 +1,10 @@ +class Base { + constructor() { + this.Foo = class { + static { + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/input.js new file mode 100644 index 000000000000..2ad952ab6667 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/.new-target/input.js @@ -0,0 +1,11 @@ +class Base { + constructor() { + this.Foo = class { + static { + // fixme: new.target should be undefined after transformed + this.foo = new.target; + } + } + } +} +expect((new Base).Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js index aea35fe5c6ec..c8d028e6cb89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = Foo.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.js index aea35fe5c6ec..c8d028e6cb89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = Foo.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js index a748d4ad1f2e..6b49f232bf89 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js @@ -1,7 +1,7 @@ class Foo { + static bar = 42; static { this.foo = this.bar; } - static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js index 657be074147c..92cd4eef0534 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js @@ -1,8 +1,14 @@ class Foo { static #bar = 21; static { - this.foo = this.#bar + this.qux; + this.foo = this.#bar; + this.qux1 = this.qux; } static qux = 21; + static { + this.qux2 = this.qux; + } } -expect(Foo.foo).toBe(42); +expect(Foo.foo).toBe(21); +expect(Foo.qux1).toBe(undefined); +expect(Foo.qux2).toBe(21); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/input.js new file mode 100644 index 000000000000..7b4c65f1e22a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/input.js @@ -0,0 +1,11 @@ +class Foo { + static #bar = 21; + static { + this.foo = this.#bar; + this.qux1 = this.qux; + } + static qux = 21; + static { + this.qux2 = this.qux; + } +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/output.js new file mode 100644 index 000000000000..e46f995b46be --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/output.js @@ -0,0 +1,20 @@ +class Foo {} + +var _bar = { + writable: true, + value: 21 +}; +var _ = { + writable: true, + value: (() => { + Foo.foo = babelHelpers.classStaticPrivateFieldSpecGet(Foo, Foo, _bar); + Foo.qux1 = Foo.qux; + })() +}; +babelHelpers.defineProperty(Foo, "qux", 21); +var _2 = { + writable: true, + value: (() => { + Foo.qux2 = Foo.qux; + })() +};