From ca20d94a7492198b450755a9d5033fb6404737f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Fri, 18 Nov 2022 14:58:48 +0900 Subject: [PATCH] fix(es/lints): Revert check for reassignment to classes (#6472) **Related issue:** - Closes https://github.com/swc-project/swc/issues/6471. --- .../errors/lints/const-assign/3/input.js | 1 - .../lints/const-assign/3/output.swc-stderr | 7 -- ...mentToParenthesizedIdentifiers.1.normal.js | 99 ++++++++++++++++--- ...ntToParenthesizedIdentifiers.2.minified.js | 39 +++++--- .../tsc-references/assignments.1.normal.js | 38 +++++-- .../tsc-references/assignments.2.minified.js | 14 +-- .../invalidUndefinedAssignments.1.normal.js | 35 +++++-- .../invalidUndefinedAssignments.2.minified.js | 15 +-- .../validNullAssignments.1.normal.js | 43 +++++--- .../validNullAssignments.2.minified.js | 16 +-- .../swc_ecma_lints/src/rules/const_assign.rs | 38 ++----- 11 files changed, 221 insertions(+), 124 deletions(-) delete mode 100644 crates/swc/tests/errors/lints/const-assign/3/input.js delete mode 100644 crates/swc/tests/errors/lints/const-assign/3/output.swc-stderr diff --git a/crates/swc/tests/errors/lints/const-assign/3/input.js b/crates/swc/tests/errors/lints/const-assign/3/input.js deleted file mode 100644 index 869749c7948f..000000000000 --- a/crates/swc/tests/errors/lints/const-assign/3/input.js +++ /dev/null @@ -1 +0,0 @@ -class X { static y = X = 0 } \ No newline at end of file diff --git a/crates/swc/tests/errors/lints/const-assign/3/output.swc-stderr b/crates/swc/tests/errors/lints/const-assign/3/output.swc-stderr deleted file mode 100644 index a0c19b856209..000000000000 --- a/crates/swc/tests/errors/lints/const-assign/3/output.swc-stderr +++ /dev/null @@ -1,7 +0,0 @@ - - x cannot reassign to a class - ,---- - 1 | class X { static y = X = 0 } - : | ^ - : `-- class name - `---- diff --git a/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.1.normal.js b/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.1.normal.js index c2e64fe145ea..fb7d4baba9bc 100644 --- a/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.1.normal.js +++ b/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.1.normal.js @@ -1,13 +1,88 @@ //// [assignmentToParenthesizedIdentifiers.ts] -//! -//! x cannot reassign to a class -//! ,-[65:1] -//! 65 | class C { -//! : | -//! : `-- class name -//! 66 | -//! 67 | } -//! 68 | -//! 69 | C = undefined; // Error -//! : ^ -//! `---- +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +var x; +x = 3; // OK +x = 3; // OK +x = ""; // Error +x = ""; // Error +var M; +(function(M) { + var y; + M.y = y; +})(M || (M = {})); +M.y = 3; // OK +M.y = 3; // OK +M.y = 3; // OK +M.y = ""; // Error +M.y = ""; // Error +M.y = ""; // Error +M = { + y: 3 +}; // Error +M = { + y: 3 +}; // Error +var M2; +(function(M2) { + var M3; + (function(M3) { + var x; + M3.x = x; + })(M3 = M2.M3 || (M2.M3 = {})); + M3 = { + x: 3 + }; // Error +})(M2 || (M2 = {})); +M2.M3 = { + x: 3 +}; // OK +M2.M3 = { + x: 3 +}; // OK +M2.M3 = { + x: 3 +}; // OK +M2.M3 = { + x: "" +}; // Error +M2.M3 = { + x: "" +}; // Error +M2.M3 = { + x: "" +}; // Error +function fn() {} +fn = function() { + return 3; +}; // Bug 823548: Should be error (fn is not a reference) +fn = function() { + return 3; +}; // Should be error +function fn2(x, y) { + x = 3; + x = 3; // OK + x = ""; // Error + x = ""; // Error + y.t = 3; // OK + y.t = 3; // OK + y.t = ""; // Error + y.t = ""; // Error + y["t"] = 3; // OK + y["t"] = 3; // OK + y["t"] = 3; // OK + y["t"] = ""; // Error + y["t"] = ""; // Error + y["t"] = ""; // Error +} +var E; +(function(E) { + E[E["A"] = 0] = "A"; +})(E || (E = {})); +E = undefined; // Error +E = undefined; // Error +var C = function C() { + "use strict"; + _class_call_check(this, C); +}; +C = undefined; // Error +C = undefined; // Error diff --git a/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.2.minified.js b/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.2.minified.js index c2e64fe145ea..e59046e55325 100644 --- a/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.2.minified.js +++ b/crates/swc/tests/tsc-references/assignmentToParenthesizedIdentifiers.2.minified.js @@ -1,13 +1,28 @@ //// [assignmentToParenthesizedIdentifiers.ts] -//! -//! x cannot reassign to a class -//! ,-[65:1] -//! 65 | class C { -//! : | -//! : `-- class name -//! 66 | -//! 67 | } -//! 68 | -//! 69 | C = undefined; // Error -//! : ^ -//! `---- +var M, M2, E; +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +!function(M) { + var y; + M.y = y; +}(M || (M = {})), M.y = 3, M.y = 3, M.y = 3, M.y = "", M.y = "", M.y = "", M = { + y: 3 +}, M = { + y: 3 +}, function(M2) { + var x; + (M2.M3 || (M2.M3 = {})).x = x; +}(M2 || (M2 = {})), M2.M3 = { + x: 3 +}, M2.M3 = { + x: 3 +}, M2.M3 = { + x: 3 +}, M2.M3 = { + x: "" +}, M2.M3 = { + x: "" +}, M2.M3 = { + x: "" +}, function(E) { + E[E.A = 0] = "A"; +}(E || (E = {})), E = void 0, E = void 0; diff --git a/crates/swc/tests/tsc-references/assignments.1.normal.js b/crates/swc/tests/tsc-references/assignments.1.normal.js index 312285c896b5..741db84407ea 100644 --- a/crates/swc/tests/tsc-references/assignments.1.normal.js +++ b/crates/swc/tests/tsc-references/assignments.1.normal.js @@ -1,10 +1,30 @@ //// [assignments.ts] -//! -//! x cannot reassign to a class -//! ,-[13:1] -//! 13 | class C { } -//! : | -//! : `-- class name -//! 14 | C = null; // Error -//! : ^ -//! `---- +// In this file: +// Assign to a module +// Assign to a class +// Assign to an enum +// Assign to a function +// Assign to a variable +// Assign to a parameter +// Assign to an interface +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +M = null; // Error +var C = function C() { + "use strict"; + _class_call_check(this, C); +}; +C = null; // Error +var E; +(function(E) { + E[E["A"] = 0] = "A"; +})(E || (E = {})); +E = null; // Error +E.A = null; // OK per spec, Error per implementation (509581) +function fn() {} +fn = null; // Should be error +var v; +v = null; // OK +function fn2(p) { + p = null; // OK +} +I = null; // Error diff --git a/crates/swc/tests/tsc-references/assignments.2.minified.js b/crates/swc/tests/tsc-references/assignments.2.minified.js index 312285c896b5..17fbc2e9b972 100644 --- a/crates/swc/tests/tsc-references/assignments.2.minified.js +++ b/crates/swc/tests/tsc-references/assignments.2.minified.js @@ -1,10 +1,6 @@ //// [assignments.ts] -//! -//! x cannot reassign to a class -//! ,-[13:1] -//! 13 | class C { } -//! : | -//! : `-- class name -//! 14 | C = null; // Error -//! : ^ -//! `---- +var E; +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +M = null, function(E) { + E[E.A = 0] = "A"; +}(E || (E = {})), (E = null).A = null, I = null; diff --git a/crates/swc/tests/tsc-references/invalidUndefinedAssignments.1.normal.js b/crates/swc/tests/tsc-references/invalidUndefinedAssignments.1.normal.js index 3c358f371f41..f26b5449cb92 100644 --- a/crates/swc/tests/tsc-references/invalidUndefinedAssignments.1.normal.js +++ b/crates/swc/tests/tsc-references/invalidUndefinedAssignments.1.normal.js @@ -1,11 +1,26 @@ //// [invalidUndefinedAssignments.ts] -//! -//! x cannot reassign to a class -//! ,-[7:1] -//! 7 | class C { foo: string } -//! : | -//! : `-- class name -//! 8 | var f: C; -//! 9 | C = x; -//! : ^ -//! `---- +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +var x; +var E; +(function(E) { + E[E["A"] = 0] = "A"; +})(E || (E = {})); +E = x; +E.A = x; +var C = function C() { + "use strict"; + _class_call_check(this, C); +}; +var f; +C = x; +var g; +g = x; +I = x; +var M; +(function(M) { + var x = M.x = 1; +})(M || (M = {})); +M = x; +function i(a) {} +// BUG 767030 +i = x; diff --git a/crates/swc/tests/tsc-references/invalidUndefinedAssignments.2.minified.js b/crates/swc/tests/tsc-references/invalidUndefinedAssignments.2.minified.js index 3c358f371f41..190518a8435e 100644 --- a/crates/swc/tests/tsc-references/invalidUndefinedAssignments.2.minified.js +++ b/crates/swc/tests/tsc-references/invalidUndefinedAssignments.2.minified.js @@ -1,11 +1,6 @@ //// [invalidUndefinedAssignments.ts] -//! -//! x cannot reassign to a class -//! ,-[7:1] -//! 7 | class C { foo: string } -//! : | -//! : `-- class name -//! 8 | var f: C; -//! 9 | C = x; -//! : ^ -//! `---- +var x, E, M; +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +!function(E) { + E[E.A = 0] = "A"; +}(E || (E = {})), (E = x).A = x, I = x, (M || (M = {})).x = 1, M = x; diff --git a/crates/swc/tests/tsc-references/validNullAssignments.1.normal.js b/crates/swc/tests/tsc-references/validNullAssignments.1.normal.js index 7a83c03fb572..d863c45fc879 100644 --- a/crates/swc/tests/tsc-references/validNullAssignments.1.normal.js +++ b/crates/swc/tests/tsc-references/validNullAssignments.1.normal.js @@ -1,12 +1,33 @@ //// [validNullAssignments.ts] -//! -//! x cannot reassign to a class -//! ,-[12:1] -//! 12 | class C { foo: string } -//! : | -//! : `-- class name -//! 13 | var f: C; -//! 14 | f = null; // ok -//! 15 | C = null; // error -//! : ^ -//! `---- +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +var a = null; +var b = null; +var c = null; +var d = null; +var e = null; +e = null; // ok +var E; +(function(E) { + E[E["A"] = 0] = "A"; +})(E || (E = {})); +E.A = null; // error +var C = function C() { + "use strict"; + _class_call_check(this, C); +}; +var f; +f = null; // ok +C = null; // error +var g; +g = null; // ok +I = null; // error +var M; +(function(M) { + var x = M.x = 1; +})(M || (M = {})); +M = null; // error +var h = null; +function i(a) { + a = null; +} +i = null; // error diff --git a/crates/swc/tests/tsc-references/validNullAssignments.2.minified.js b/crates/swc/tests/tsc-references/validNullAssignments.2.minified.js index 7a83c03fb572..bd74743091fb 100644 --- a/crates/swc/tests/tsc-references/validNullAssignments.2.minified.js +++ b/crates/swc/tests/tsc-references/validNullAssignments.2.minified.js @@ -1,12 +1,6 @@ //// [validNullAssignments.ts] -//! -//! x cannot reassign to a class -//! ,-[12:1] -//! 12 | class C { foo: string } -//! : | -//! : `-- class name -//! 13 | var f: C; -//! 14 | f = null; // ok -//! 15 | C = null; // error -//! : ^ -//! `---- +var E, M; +import _class_call_check from "@swc/helpers/src/_class_call_check.mjs"; +!function(E) { + E[E.A = 0] = "A"; +}(E || (E = {})), E.A = null, I = null, (M || (M = {})).x = 1, M = null; diff --git a/crates/swc_ecma_lints/src/rules/const_assign.rs b/crates/swc_ecma_lints/src/rules/const_assign.rs index 96a87b77202d..22a36fea900c 100644 --- a/crates/swc_ecma_lints/src/rules/const_assign.rs +++ b/crates/swc_ecma_lints/src/rules/const_assign.rs @@ -11,8 +11,7 @@ pub fn const_assign() -> Box { #[derive(Debug, Default)] struct ConstAssign { const_vars: AHashMap, - import_bindings: AHashMap, - classes: AHashMap, + import_binding: AHashMap, is_pat_decl: bool, } @@ -41,7 +40,7 @@ impl ConstAssign { }); } - if let Some(&binding_span) = self.import_bindings.get(&id.to_id()) { + if let Some(&binding_span) = self.import_binding.get(&id.to_id()) { HANDLER.with(|handler| { handler .struct_span_err(id.span, "cannot reassign to an imported binding") @@ -49,15 +48,6 @@ impl ConstAssign { .emit(); }); } - - if let Some(&binding_span) = self.classes.get(&id.to_id()) { - HANDLER.with(|handler| { - handler - .struct_span_err(id.span, "cannot reassign to a class") - .span_label(binding_span, "class name") - .emit(); - }); - } } } @@ -73,8 +63,7 @@ impl Visit for ConstAssign { fn visit_module(&mut self, program: &Module) { program.visit_children_with(&mut Collector { const_vars: &mut self.const_vars, - import_bindings: &mut self.import_bindings, - classes: &mut self.classes, + import_binding: &mut self.import_binding, var_decl_kind: None, }); @@ -112,8 +101,7 @@ impl Visit for ConstAssign { const_vars: &mut self.const_vars, // I don't believe that import stmt exists in Script // But it's ok. Let's pass it in. - import_bindings: &mut self.import_bindings, - classes: &mut self.classes, + import_binding: &mut self.import_binding, var_decl_kind: None, }); @@ -132,8 +120,7 @@ impl Visit for ConstAssign { struct Collector<'a> { const_vars: &'a mut AHashMap, - import_bindings: &'a mut AHashMap, - classes: &'a mut AHashMap, + import_binding: &'a mut AHashMap, var_decl_kind: Option, } @@ -146,7 +133,7 @@ impl Visit for Collector<'_> { ImportSpecifier::Named(ImportNamedSpecifier { local, .. }) | ImportSpecifier::Default(ImportDefaultSpecifier { local, .. }) | ImportSpecifier::Namespace(ImportStarAsSpecifier { local, .. }) => { - self.import_bindings.insert(local.to_id(), local.span); + self.import_binding.insert(local.to_id(), local.span); } } } @@ -186,17 +173,4 @@ impl Visit for Collector<'_> { self.var_decl_kind = old_var_decl_kind; } - - fn visit_class_decl(&mut self, class: &ClassDecl) { - *self.classes.entry(class.ident.to_id()).or_default() = class.ident.span; - - class.visit_children_with(self); - } - - fn visit_class_expr(&mut self, class: &ClassExpr) { - if let Some(ident) = &class.ident { - *self.classes.entry(ident.to_id()).or_default() = ident.span; - } - class.visit_children_with(self); - } }