diff --git a/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.1.normal.js b/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.1.normal.js index 9e171cb0f299..5ad07c553b57 100644 --- a/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.1.normal.js +++ b/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.1.normal.js @@ -1,6 +1,6 @@ //// [computedPropertyNames21_ES5.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; -var C = /*#__PURE__*/ function() { +var C = /*#__PURE__*/ function(_prop) { "use strict"; function C() { _class_call_check(this, C); @@ -9,6 +9,6 @@ var C = /*#__PURE__*/ function() { _proto.bar = function bar() { return 0; }; - _proto[this.bar()] = function() {}; + _proto[_prop] = function() {}; return C; -}(); +}(this.bar()); diff --git a/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.2.minified.js b/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.2.minified.js index 74f847588756..247c0a335f38 100644 --- a/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.2.minified.js +++ b/crates/swc/tests/tsc-references/computedPropertyNames21_ES5.2.minified.js @@ -1,2 +1,3 @@ //// [computedPropertyNames21_ES5.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +this.bar(); diff --git a/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.1.normal.js b/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.1.normal.js index a4e061a1eca6..27c184ad9f3a 100644 --- a/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.1.normal.js +++ b/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.1.normal.js @@ -1,7 +1,7 @@ //// [computedPropertyNames23_ES5.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; import _define_property from "@swc/helpers/src/_define_property.mjs"; -var C = /*#__PURE__*/ function() { +var C = /*#__PURE__*/ function(_prop) { "use strict"; function C() { _class_call_check(this, C); @@ -10,6 +10,6 @@ var C = /*#__PURE__*/ function() { _proto.bar = function bar() { return 0; }; - _proto[_define_property({}, this.bar(), 1)[0]] = function() {}; + _proto[_prop] = function() {}; return C; -}(); +}(_define_property({}, this.bar(), 1)[0]); diff --git a/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.2.minified.js b/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.2.minified.js index a7cb8ebe504d..5aa2acce459f 100644 --- a/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.2.minified.js +++ b/crates/swc/tests/tsc-references/computedPropertyNames23_ES5.2.minified.js @@ -1,3 +1,4 @@ //// [computedPropertyNames23_ES5.ts] import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; import _define_property from "@swc/helpers/src/_define_property.mjs"; +_define_property({}, this.bar(), 1)[0]; diff --git a/crates/swc_ecma_transforms_compat/src/es2015/classes/mod.rs b/crates/swc_ecma_transforms_compat/src/es2015/classes/mod.rs index b769fb451225..859ca0850733 100644 --- a/crates/swc_ecma_transforms_compat/src/es2015/classes/mod.rs +++ b/crates/swc_ecma_transforms_compat/src/es2015/classes/mod.rs @@ -7,9 +7,9 @@ use swc_ecma_transforms_base::{helper, native::is_native, perf::Check}; use swc_ecma_transforms_classes::super_field::SuperFieldAccessFolder; use swc_ecma_transforms_macros::fast_path; use swc_ecma_utils::{ - alias_if_required, default_constructor, is_valid_ident, is_valid_prop_ident, prepend_stmt, - private_ident, prop_name_to_expr, quote_expr, quote_ident, quote_str, replace_ident, - ExprFactory, IdentExt, IsDirective, ModuleItemLike, StmtLike, + alias_if_required, contains_this_expr, default_constructor, is_valid_ident, + is_valid_prop_ident, prepend_stmt, private_ident, prop_name_to_expr, quote_expr, quote_ident, + quote_str, replace_ident, ExprFactory, IdentExt, IsDirective, ModuleItemLike, StmtLike, }; use swc_ecma_visit::{ as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith, @@ -535,7 +535,6 @@ where let class_name = class_name.unwrap_or_else(|| quote_ident!("_class")); let mut stmts = vec![]; - let mut priv_methods = vec![]; let mut methods = vec![]; let mut constructor = None; for member in class.body { @@ -547,7 +546,9 @@ where constructor = Some(c) } } - ClassMember::PrivateMethod(m) => priv_methods.push(m), + ClassMember::PrivateMethod(_) => unreachable!( + "classes pass: private method\nclass_properties pass should remove this" + ), ClassMember::Method(m) => methods.push(m), ClassMember::ClassProp(..) => { @@ -773,7 +774,6 @@ where } // convert class methods - // stmts.extend(self.fold_class_methods(class_name.clone(), priv_methods)); stmts.extend(self.fold_class_methods(&class_name, &super_class_ident, methods)); if stmts.first().map(|v| !v.is_use_strict()).unwrap_or(false) && !self.in_strict { @@ -1009,11 +1009,13 @@ where for mut m in methods { let key = HashKey::from(&m.key); let key_is_pure = is_pure_prop_name(&m.key); + // class is always strict, however computed key is not part of class + let key_contain_this = !self.in_strict && contains_this_expr(&m.key); let key_prop = Box::new(m.key.clone()); let computed = matches!(m.key, PropName::Computed(..)); let prop_name = prop_name_to_expr(m.key); - let key_prop = if should_extract && !key_is_pure { + let key_prop = if should_extract && !key_is_pure || key_contain_this { let ident = private_ident!("_prop"); self.params.push(ident.clone().into()); diff --git a/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/input.js b/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/input.js new file mode 100644 index 000000000000..9ccef33fa203 --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/input.js @@ -0,0 +1,3 @@ +class x { + [this[0]]() {} +} diff --git a/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/output.js b/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/output.js new file mode 100644 index 000000000000..aaf67c6c5886 --- /dev/null +++ b/crates/swc_ecma_transforms_compat/tests/classes/issue-6356/output.js @@ -0,0 +1,13 @@ +let x = /*#__PURE__*/ function(_prop) { + "use strict"; + function x() { + _classCallCheck(this, x); + } + _createClass(x, [ + { + key: _prop, + value: function() {} + } + ]); + return x; +}(this[0]);