fix(es/lints): Revert check for reassignment to classes (#6472)

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/6471.
This commit is contained in:
Donny/강동윤 2022-11-18 14:58:48 +09:00 committed by GitHub
parent 19b45d299f
commit ca20d94a74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 221 additions and 124 deletions

View File

@ -1 +0,0 @@
class X { static y = X = 0 }

View File

@ -1,7 +0,0 @@
x cannot reassign to a class
,----
1 | class X { static y = X = 0 }
: | ^
: `-- class name
`----

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,8 +11,7 @@ pub fn const_assign() -> Box<dyn Rule> {
#[derive(Debug, Default)]
struct ConstAssign {
const_vars: AHashMap<Id, Span>,
import_bindings: AHashMap<Id, Span>,
classes: AHashMap<Id, Span>,
import_binding: AHashMap<Id, Span>,
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<Id, Span>,
import_bindings: &'a mut AHashMap<Id, Span>,
classes: &'a mut AHashMap<Id, Span>,
import_binding: &'a mut AHashMap<Id, Span>,
var_decl_kind: Option<VarDeclKind>,
}
@ -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);
}
}