Skip to content

Commit

Permalink
feat(es/compat): Skip empty class static blocks (#8138)
Browse files Browse the repository at this point in the history
**Description:**

And update the `static_block_private_id` generate rules to be consistent with Babel.

**Related issue:**

 - #8136
  • Loading branch information
magic-akari committed Oct 18, 2023
1 parent 34b0167 commit e186b80
Show file tree
Hide file tree
Showing 16 changed files with 61 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,3 @@ var __5 = {
writable: true,
value: 1
};
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,4 @@ var __5 = {
writable: true,
value: 5
};
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
(()=>{})();
console.log(_C__1);
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ function foo() {
}, _class.foo = 1, (()=>{
var _class;
const c = (_class = class {
}, _class.bar = 2, (()=>{
// do
})(), _class);
}, _class.bar = 2, _class);
})(), _class;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ function foo() {
var c = (_class = function _class() {
"use strict";
_class_call_check(this, _class);
}, _class.bar = 2, function() {
// do
}(), _class);
}, _class.bar = 2, _class);
}(), _class;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,3 @@ var C = function C() {
"use strict";
_class_call_check(this, C);
};
(function() {
// something
})();
42 changes: 28 additions & 14 deletions crates/swc_ecma_compat_es2022/src/static_blocks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ pub fn static_blocks(mark: Mark) -> impl Fold + VisitMut {

#[swc_trace]
impl ClassStaticBlock {
fn visit_mut_static_block(
fn transform_static_block(
&mut self,
mut static_block: StaticBlock,
private_id: JsWord,
Expand Down Expand Up @@ -86,22 +86,36 @@ impl VisitMut for ClassStaticBlock {
}
}

let mut count = 0;
for member in class.body.iter_mut() {
if let ClassMember::StaticBlock(static_block) = member {
let static_block_private_id: JsWord = {
let mut id_value: JsWord = "_".into();
let mut count = 0;
while private_names.contains(&id_value) {
count += 1;
id_value = format!("_{}", count).into();
}
private_names.insert(id_value.clone());
id_value
};
*member = ClassMember::PrivateProp(
self.visit_mut_static_block(static_block.take(), static_block_private_id),
)
if static_block.body.stmts.is_empty() {
*member = ClassMember::dummy();
continue;
}

let static_block_private_id = generate_uid(&private_names, &mut count);
*member = self
.transform_static_block(static_block.take(), static_block_private_id)
.into();
};
}
}
}

fn generate_uid(deny_list: &AHashSet<JsWord>, i: &mut u32) -> JsWord {
*i += 1;

let mut uid: JsWord = if *i == 1 {
"_".to_string()
} else {
format!("_{i}")
}
.into();
while deny_list.contains(&uid) {
*i += 1;
uid = format!("_{i}").into();
}

uid
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export default class Foo {
#foo;
static #_ = (()=>{})();
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ class Foo {
this.qux1 = this.qux;
})();
static qux = 21;
static #_1 = this.qux2 = this.qux;
static #_2 = this.qux2 = this.qux;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class Foo {
static #_ = 42;
static #_1 = this.foo = this.#_;
static #_2 = this.foo = this.#_;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var __ = {
classDec
])
};
var __1 = {
var __2 = {
writable: true,
value: _initClass()
};
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var __ = {
classDec
])
};
var __1 = {
var __2 = {
writable: true,
value: _initClass()
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
var _A, __, __1, __2, _C, __3, __11, __21, _class, __4, __12, __22, _class1, __5, __13, __23, _G, __6, __14, __24, _class2, __7, __15, __25, _class3, __8, __16, __26, _K, __9, __17, __27;
var _A, __, __2, _C, __1, __21, _class, __3, __22, _class1, __4, __23, _G, __5, __24, _class2, __6, __25, _class3, __7, __26, _K, __8, __27;
var _initClass, _A1, _initClass1, _C1, _initClass2, _class4, _initClass3, _class5, _initClass4, _G1, _initClass5, _class6, _initClass6, _class7, _I, _initClass7, _K1, _L;
const dec = ()=>{};
const A = ((_A = class A {
Expand All @@ -7,118 +7,91 @@ const A = ((_A = class A {
value: { c: [_A1, _initClass] } = _apply_decs_2203_r(_A, [], [
dec
])
}, __1 = {
writable: true,
value: (()=>{})()
}, __2 = {
writable: true,
value: _initClass()
}, _A), _A1);
const B = ((_C = class C {
}, __3 = {
}, __1 = {
writable: true,
value: { c: [_C1, _initClass1] } = _apply_decs_2203_r(_C, [], [
dec
])
}, __11 = {
writable: true,
value: (()=>{})()
}, __21 = {
writable: true,
value: _initClass1()
}, _C), _C1);
const D = ((_class = class {
}, __4 = {
}, __3 = {
writable: true,
value: { c: [_class4, _initClass2] } = _apply_decs_2203_r(_class, [], [
dec
])
}, __12 = {
writable: true,
value: (()=>{})()
}, __22 = {
writable: true,
value: _initClass2()
}, _class), _class4);
const E = (((_class1 = class {
}, __5 = {
}, __4 = {
writable: true,
value: { c: [_class5, _initClass3] } = _apply_decs_2203_r(_class1, [], [
dec
])
}, __13 = {
writable: true,
value: (()=>{})()
}, __23 = {
writable: true,
value: _initClass3()
}, _class1), _class5), 123);
const F = [
((_G = class G {
}, __6 = {
}, __5 = {
writable: true,
value: { c: [_G1, _initClass4] } = _apply_decs_2203_r(_G, [], [
dec
])
}, __14 = {
writable: true,
value: (()=>{})()
}, __24 = {
writable: true,
value: _initClass4()
}, _G), _G1),
((_class2 = class {
}, __7 = {
}, __6 = {
writable: true,
value: { c: [_class6, _initClass5] } = _apply_decs_2203_r(_class2, [], [
dec
])
}, __15 = {
writable: true,
value: (()=>{})()
}, __25 = {
writable: true,
value: _initClass5()
}, _class2), _class6)
];
const H = ((_class3 = class extends (_I = I) {
}, __8 = {
}, __7 = {
writable: true,
value: { c: [_class7, _initClass6] } = _apply_decs_2203_r(_class3, [], [
dec
], _I)
}, __16 = {
writable: true,
value: (()=>{})()
}, __26 = {
writable: true,
value: _initClass6()
}, _class3), _class7);
const J = ((_K = class K extends (_L = L) {
}, __9 = {
}, __8 = {
writable: true,
value: { c: [_K1, _initClass7] } = _apply_decs_2203_r(_K, [], [
dec
], _L)
}, __17 = {
writable: true,
value: (()=>{})()
}, __27 = {
writable: true,
value: _initClass7()
}, _K), _K1);
function classFactory() {
var _class, __, __1, __2;
var _class, __, __2;
var _initClass, _class1;
return _class = class {
}, __ = {
writable: true,
value: { c: [_class1, _initClass] } = _apply_decs_2203_r(_class, [], [
dec
])
}, __1 = {
writable: true,
value: (()=>{})()
}, __2 = {
writable: true,
value: _initClass()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
var _A, __, __1, _C, __2, __11, _class, __3, __12, _class1, __4, __13, _G, __5, __14, _class2, __6, __15, _class3, __7, __16, _K, __8, __17;
var _A, __, __2, _C, __1, __21, _class, __3, __22, _class1, __4, __23, _G, __5, __24, _class2, __6, __25, _class3, __7, __26, _K, __8, __27;
var _initClass, _A1, _initClass1, _C1, _initClass2, _class4, _initClass3, _class5, _initClass4, _G1, _initClass5, _class6, _initClass6, _class7, _I, _initClass7, _K1, _L;
const dec = ()=>{};
const A = ((_A = class A {
Expand All @@ -7,17 +7,17 @@ const A = ((_A = class A {
value: { c: [_A1, _initClass] } = _apply_decs_2203_r(_A, [], [
dec
])
}, __1 = {
}, __2 = {
writable: true,
value: _initClass()
}, _A), _A1);
const B = ((_C = class C {
}, __2 = {
}, __1 = {
writable: true,
value: { c: [_C1, _initClass1] } = _apply_decs_2203_r(_C, [], [
dec
])
}, __11 = {
}, __21 = {
writable: true,
value: _initClass1()
}, _C), _C1);
Expand All @@ -27,7 +27,7 @@ const D = ((_class = class {
value: { c: [_class4, _initClass2] } = _apply_decs_2203_r(_class, [], [
dec
])
}, __12 = {
}, __22 = {
writable: true,
value: _initClass2()
}, _class), _class4);
Expand All @@ -37,7 +37,7 @@ const E = (((_class1 = class {
value: { c: [_class5, _initClass3] } = _apply_decs_2203_r(_class1, [], [
dec
])
}, __13 = {
}, __23 = {
writable: true,
value: _initClass3()
}, _class1), _class5), 123);
Expand All @@ -48,7 +48,7 @@ const F = [
value: { c: [_G1, _initClass4] } = _apply_decs_2203_r(_G, [], [
dec
])
}, __14 = {
}, __24 = {
writable: true,
value: _initClass4()
}, _G), _G1),
Expand All @@ -58,7 +58,7 @@ const F = [
value: { c: [_class6, _initClass5] } = _apply_decs_2203_r(_class2, [], [
dec
])
}, __15 = {
}, __25 = {
writable: true,
value: _initClass5()
}, _class2), _class6)
Expand All @@ -69,7 +69,7 @@ const H = ((_class3 = class extends (_I = I) {
value: { c: [_class7, _initClass6] } = _apply_decs_2203_r(_class3, [], [
dec
], _I)
}, __16 = {
}, __26 = {
writable: true,
value: _initClass6()
}, _class3), _class7);
Expand All @@ -79,20 +79,20 @@ const J = ((_K = class K extends (_L = L) {
value: { c: [_K1, _initClass7] } = _apply_decs_2203_r(_K, [], [
dec
], _L)
}, __17 = {
}, __27 = {
writable: true,
value: _initClass7()
}, _K), _K1);
function classFactory() {
var _class, __, __1;
var _class, __, __2;
var _initClass, _class1;
return _class = class {
}, __ = {
writable: true,
value: { c: [_class1, _initClass] } = _apply_decs_2203_r(_class, [], [
dec
])
}, __1 = {
}, __2 = {
writable: true,
value: _initClass()
}, _class, _class1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,20 @@ var __ = {
dec1
])
};
var __1 = {
var __2 = {
writable: true,
value: _initClass()
};
let _Foo;
class Foo extends (_Bar = _Bar1) {
}
var __2 = {
var __1 = {
writable: true,
value: { c: [_Foo, _initClass1] } = _apply_decs_2203_r(Foo, [], [
dec2
], _Bar)
};
var __11 = {
var __21 = {
writable: true,
value: _initClass1()
};

1 comment on commit e186b80

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: e186b80 Previous: bffe33a Ratio
es/full/bugs-1 282550 ns/iter (± 7717) 284101 ns/iter (± 5089) 0.99
es/full/minify/libraries/antd 1384373816 ns/iter (± 19517629) 1402131384 ns/iter (± 13074805) 0.99
es/full/minify/libraries/d3 291684503 ns/iter (± 2637807) 295972404 ns/iter (± 2395737) 0.99
es/full/minify/libraries/echarts 1107930076 ns/iter (± 6037957) 1129919682 ns/iter (± 4272904) 0.98
es/full/minify/libraries/jquery 88911549 ns/iter (± 918564) 89298718 ns/iter (± 208814) 1.00
es/full/minify/libraries/lodash 103603119 ns/iter (± 315351) 104544053 ns/iter (± 266372) 0.99
es/full/minify/libraries/moment 52161073 ns/iter (± 76455) 52651896 ns/iter (± 107827) 0.99
es/full/minify/libraries/react 18828503 ns/iter (± 52955) 18967284 ns/iter (± 110836) 0.99
es/full/minify/libraries/terser 229079800 ns/iter (± 1565967) 230975986 ns/iter (± 825561) 0.99
es/full/minify/libraries/three 411031599 ns/iter (± 2178496) 413013854 ns/iter (± 2520735) 1.00
es/full/minify/libraries/typescript 2792299928 ns/iter (± 7248821) 2792014299 ns/iter (± 7520902) 1.00
es/full/minify/libraries/victory 594477849 ns/iter (± 5600441) 599994242 ns/iter (± 2696170) 0.99
es/full/minify/libraries/vue 125406477 ns/iter (± 533624) 128628100 ns/iter (± 1047610) 0.97
es/full/codegen/es3 33266 ns/iter (± 83) 35326 ns/iter (± 143) 0.94
es/full/codegen/es5 33251 ns/iter (± 121) 35517 ns/iter (± 146) 0.94
es/full/codegen/es2015 33262 ns/iter (± 101) 35375 ns/iter (± 97) 0.94
es/full/codegen/es2016 33201 ns/iter (± 64) 35429 ns/iter (± 40) 0.94
es/full/codegen/es2017 33225 ns/iter (± 179) 35361 ns/iter (± 98) 0.94
es/full/codegen/es2018 33169 ns/iter (± 76) 35489 ns/iter (± 171) 0.93
es/full/codegen/es2019 33254 ns/iter (± 66) 35412 ns/iter (± 127) 0.94
es/full/codegen/es2020 33198 ns/iter (± 70) 35461 ns/iter (± 125) 0.94
es/full/all/es3 177186202 ns/iter (± 1240760) 176745682 ns/iter (± 1104320) 1.00
es/full/all/es5 170003284 ns/iter (± 774839) 169236775 ns/iter (± 1105646) 1.00
es/full/all/es2015 130917469 ns/iter (± 5958145) 128214840 ns/iter (± 694454) 1.02
es/full/all/es2016 127629620 ns/iter (± 917737) 126746080 ns/iter (± 878373) 1.01
es/full/all/es2017 127703572 ns/iter (± 1340654) 126127936 ns/iter (± 680482) 1.01
es/full/all/es2018 125494822 ns/iter (± 345831) 124531356 ns/iter (± 668499) 1.01
es/full/all/es2019 125101983 ns/iter (± 1004671) 123807639 ns/iter (± 840679) 1.01
es/full/all/es2020 120896160 ns/iter (± 377928) 120288284 ns/iter (± 819585) 1.01
es/full/parser 562199 ns/iter (± 4451) 565911 ns/iter (± 3729) 0.99
es/full/base/fixer 17652 ns/iter (± 44) 19239 ns/iter (± 265) 0.92
es/full/base/resolver_and_hygiene 85003 ns/iter (± 571) 84076 ns/iter (± 206) 1.01

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.