Support multiple static blocks (#12738)

This commit is contained in:
Huáng Jùnliàng
2021-03-12 17:29:55 -05:00
committed by GitHub
parent 05fa18e652
commit 1a05b81387
35 changed files with 231 additions and 52 deletions

View File

@@ -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();
},
},
};

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -0,0 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
}
expect(Foo.foo).toBe(42);

View File

@@ -0,0 +1,8 @@
class Foo {
static bar = 42;
static #_ = (() => {
this.foo = Foo.bar;
})();
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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;
})();
}

View File

@@ -0,0 +1,10 @@
class Base {
constructor() {
this.Foo = class {
static {
this.foo = new.target;
}
}
}
}
expect((new Base).Foo.foo).toBe(undefined);

View File

@@ -0,0 +1,10 @@
class Base {
constructor() {
this.Foo = class {
static {
this.foo = new.target;
}
}
}
}
expect((new Base).Foo.foo).toBe(undefined);

View File

@@ -0,0 +1,12 @@
class Base {
constructor() {
this.Foo = class {
static #_ = (() => {
this.foo = new.target;
})();
};
}
}
expect(new Base().Foo.foo).toBe(undefined);

View File

@@ -0,0 +1,10 @@
class Base {
constructor() {
this.Foo = class {
static {
this.foo = new.target;
}
}
}
}
expect((new Base).Foo.foo).toBe(undefined);

View File

@@ -0,0 +1,10 @@
class Base {
constructor() {
this.Foo = class {
static {
this.foo = new.target;
}
}
}
}
expect((new Base).Foo.foo).toBe(undefined);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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;
})()
});

View File

@@ -0,0 +1,10 @@
class Base {
constructor() {
this.Foo = class {
static {
this.foo = new.target;
}
}
}
}
expect((new Base).Foo.foo).toBe(undefined);

View File

@@ -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);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = Foo.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -1,7 +1,7 @@
class Foo {
static bar = 42;
static {
this.foo = this.bar;
}
static bar = 42;
}
expect(Foo.foo).toBe(42);

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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;
})()
};