mirror of
https://github.com/swc-project/swc.git
synced 2024-10-05 04:39:06 +03:00
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:
parent
19b45d299f
commit
ca20d94a74
@ -1 +0,0 @@
|
||||
class X { static y = X = 0 }
|
@ -1,7 +0,0 @@
|
||||
|
||||
x cannot reassign to a class
|
||||
,----
|
||||
1 | class X { static y = X = 0 }
|
||||
: | ^
|
||||
: `-- class name
|
||||
`----
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user