Skip to content

Commit

Permalink
fix(es/compat): Generate OptCall for OptCall for private fields (#…
Browse files Browse the repository at this point in the history
…8031)

**Related issue:**

 - Closes #8003
  • Loading branch information
Austaras committed Sep 29, 2023
1 parent 7f91274 commit 06b6eb9
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class A {
var _class_private_field_get1;
var _this_getInstance;
_class_private_field_get(this, _fieldFunc).call(this);
((_class_private_field_get1 = _class_private_field_get(this, _fieldFunc)) === null || _class_private_field_get1 === void 0 ? void 0 : _class_private_field_get1.call)(this);
(_class_private_field_get1 = _class_private_field_get(this, _fieldFunc)) === null || _class_private_field_get1 === void 0 ? void 0 : _class_private_field_get1.call(this);
const func = _class_private_field_get(this, _fieldFunc);
func();
new (_class_private_field_get(this, _fieldFunc))();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class A {
test() {
var _class_static_private_field_spec_get1;
_class_static_private_field_spec_get(A, A, _fieldFunc).call(A);
((_class_static_private_field_spec_get1 = _class_static_private_field_spec_get(A, A, _fieldFunc)) === null || _class_static_private_field_spec_get1 === void 0 ? void 0 : _class_static_private_field_spec_get1.call)(A);
(_class_static_private_field_spec_get1 = _class_static_private_field_spec_get(A, A, _fieldFunc)) === null || _class_static_private_field_spec_get1 === void 0 ? void 0 : _class_static_private_field_spec_get1.call(A);
const func = _class_static_private_field_spec_get(A, A, _fieldFunc);
func();
new (_class_static_private_field_spec_get(A, A, _fieldFunc))();
Expand Down
16 changes: 9 additions & 7 deletions crates/swc_ecma_transforms_base/src/fixer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,16 @@ impl Fixer<'_> {
}

fn wrap_callee(&mut self, e: &mut Expr) {
if match e {
Expr::Lit(Lit::Num(..) | Lit::Str(..)) => false,
match e {
Expr::Lit(Lit::Num(..) | Lit::Str(..)) => (),
Expr::Cond(..)
| Expr::Bin(..)
| Expr::Lit(..)
| Expr::Unary(..)
| Expr::Object(..)
| Expr::Await(..)
| Expr::Yield(..) => true,
_ => false,
} {
self.wrap(e)
| Expr::Yield(..) => self.wrap(e),
_ => (),
}
}
}
Expand Down Expand Up @@ -400,7 +398,11 @@ impl VisitMut for Fixer<'_> {
fn visit_mut_call_expr(&mut self, node: &mut CallExpr) {
let old = self.visit_call(&mut node.args, &mut node.callee);
if let Callee::Expr(e) = &mut node.callee {
self.wrap_callee(e)
if let Expr::OptChain(_) = &**e {
self.wrap(e)
} else {
self.wrap_callee(e)
}
}

self.ctx = old;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -455,21 +455,28 @@ impl<'a> VisitMut for PrivateAccessVisitor<'a> {
let (expr, this) = self.visit_mut_private_get(&mut callee, None);
if let Some(this) = this {
let args = iter::once(this.as_arg()).chain(call.args.take()).collect();
*e = Expr::Call(CallExpr {
let call = OptCall {
span: *span,
callee: OptChainExpr {
span: *span,
optional: *optional,
base: Box::new(OptChainBase::Member(MemberExpr {
span: call.span,
obj: Box::new(expr),
prop: MemberProp::Ident(quote_ident!("call")),
})),
}
.as_callee(),
callee: Box::new(
OptChainExpr {
span: *span,
optional: *optional,
base: Box::new(OptChainBase::Member(MemberExpr {
span: call.span,
obj: Box::new(expr),
prop: MemberProp::Ident(quote_ident!("call")),
})),
}
.into(),
),
args,
type_args: call.type_args.take(),
});
};
*e = Expr::OptChain(OptChainExpr {
span: *span,
optional: false,
base: Box::new(OptChainBase::Call(call)),
})
} else {
call.callee = Box::new(expr);
}
Expand Down
39 changes: 39 additions & 0 deletions crates/swc_ecma_transforms_compat/tests/es2022_class_properties.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use swc_ecma_transforms_compat::{
es2015::{arrow, block_scoping, classes, function_name, template_literal},
es2016::exponentiation,
es2017::async_to_generator,
es2020::optional_chaining,
es2022::class_properties,
es3::reserved_words,
};
Expand Down Expand Up @@ -6669,3 +6670,41 @@ var _x = {
};
"#
);

test!(
syntax(),
|t| {
let unresolved = Mark::new();
chain!(
class_properties(Some(t.comments.clone()), Default::default()),
optional_chaining(Default::default(), unresolved)
)
},
issue_8003,
"
class Foo {
#priv
search() {
this.#priv?.()
}
}
console.log(new Foo().search())",
r#"
var _priv = new WeakMap();
class Foo {
search() {
var _class_private_field_get1;
(_class_private_field_get1 = _class_private_field_get(this, _priv)) === null || _class_private_field_get1 === void 0 ? void 0 : _class_private_field_get1.call(this);
}
constructor(){
_class_private_field_init(this, _priv, {
writable: true,
value: void 0
});
}
}
console.log(new Foo().search());
"#
);

1 comment on commit 06b6eb9

@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: 06b6eb9 Previous: dec68c3 Ratio
es/full/bugs-1 281753 ns/iter (± 8214) 278320 ns/iter (± 3663) 1.01
es/full/minify/libraries/antd 1310902953 ns/iter (± 6290217) 1325740547 ns/iter (± 14399459) 0.99
es/full/minify/libraries/d3 276267250 ns/iter (± 4052925) 273414334 ns/iter (± 4823000) 1.01
es/full/minify/libraries/echarts 1068183291 ns/iter (± 24378636) 1063544769 ns/iter (± 24265209) 1.00
es/full/minify/libraries/jquery 83842395 ns/iter (± 312468) 84180696 ns/iter (± 483577) 1.00
es/full/minify/libraries/lodash 97117168 ns/iter (± 457172) 97310137 ns/iter (± 285425) 1.00
es/full/minify/libraries/moment 50227921 ns/iter (± 141711) 49905170 ns/iter (± 67642) 1.01
es/full/minify/libraries/react 17986911 ns/iter (± 69693) 18064992 ns/iter (± 501925) 1.00
es/full/minify/libraries/terser 217090952 ns/iter (± 564132) 217631009 ns/iter (± 2421558) 1.00
es/full/minify/libraries/three 383859496 ns/iter (± 1302227) 386442276 ns/iter (± 4569242) 0.99
es/full/minify/libraries/typescript 2642355444 ns/iter (± 16280606) 2659527963 ns/iter (± 14186023) 0.99
es/full/minify/libraries/victory 562936170 ns/iter (± 8543489) 561141164 ns/iter (± 2440745) 1.00
es/full/minify/libraries/vue 119196850 ns/iter (± 380357) 119535346 ns/iter (± 439943) 1.00
es/full/codegen/es3 34217 ns/iter (± 137) 34742 ns/iter (± 124) 0.98
es/full/codegen/es5 34228 ns/iter (± 45) 34469 ns/iter (± 362) 0.99
es/full/codegen/es2015 34376 ns/iter (± 1709) 34568 ns/iter (± 73) 0.99
es/full/codegen/es2016 34225 ns/iter (± 125) 34507 ns/iter (± 91) 0.99
es/full/codegen/es2017 34247 ns/iter (± 55) 34507 ns/iter (± 77) 0.99
es/full/codegen/es2018 34321 ns/iter (± 133) 34488 ns/iter (± 102) 1.00
es/full/codegen/es2019 34352 ns/iter (± 62) 34515 ns/iter (± 69) 1.00
es/full/codegen/es2020 34201 ns/iter (± 51) 34471 ns/iter (± 2150) 0.99
es/full/all/es3 165378325 ns/iter (± 495175) 167907365 ns/iter (± 1277805) 0.98
es/full/all/es5 157742655 ns/iter (± 863676) 159301226 ns/iter (± 1369060) 0.99
es/full/all/es2015 117999119 ns/iter (± 868427) 118558987 ns/iter (± 804464) 1.00
es/full/all/es2016 116922708 ns/iter (± 758007) 117481367 ns/iter (± 614264) 1.00
es/full/all/es2017 116568097 ns/iter (± 2323613) 117066819 ns/iter (± 650122) 1.00
es/full/all/es2018 114292795 ns/iter (± 612608) 114612197 ns/iter (± 1378078) 1.00
es/full/all/es2019 113934104 ns/iter (± 696130) 114355791 ns/iter (± 898406) 1.00
es/full/all/es2020 109367898 ns/iter (± 353843) 109782249 ns/iter (± 522399) 1.00
es/full/parser 491699 ns/iter (± 6408) 503848 ns/iter (± 5070) 0.98
es/full/base/fixer 17924 ns/iter (± 65) 18488 ns/iter (± 126) 0.97
es/full/base/resolver_and_hygiene 80678 ns/iter (± 214) 81585 ns/iter (± 244) 0.99
serialization of serde 287 ns/iter (± 0) 290 ns/iter (± 3) 0.99

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

Please sign in to comment.